menu

darmowe eBooki

Efekt Motyla

okładka

Książka, która wywróci Twoje życie do góry nogami

Sprawdź sam, czytając darmowy fragment eBooka Efekt Motyla.

Czy ta wiedza okazała się dla Ciebie przydatna? Chcesz wiedzieć więcej? Zobacz tutaj.

Google Adsense

migawka z forum

Dowcipy o programistach/informatykach

Witam, grunt to potrafić śmiać sie z samego siebie  ;DPrzychodzi informatyk do domu po pra...

Rysiek z "Klanu"

W związku z ogromnym poruszeniem we wszystkich mediach w naszym kraju, dotyczącym tak kultowej postaci jak Rysiek z &quo...

Propozycje zmian w serwisie Guide C++

Witam, ze względu na to że nie znalazłem podobnego tematu na forum, a mam kilka sugestii   ;) postanowiłem je ...

buttony

SDJ
vortal programistów
Vademecum sieci komputerowych
Soldiers'04 - fan klub Legii Warszawa
www.katalog.bajery.pl
katalog stron
katalog najlepszych stron
jestem w katalogu
Wszystko o C++
[zamknij]

Korzystamy z plików cookies i umożliwiamy zamieszczanie ich osobom trzecim. Pliki cookie pozwalają na poznanie twoich preferencji na podstawie zachowań w serwisie.
Uznajemy, że jeżeli kontynuujesz korzystanie z serwisu, wyrażasz na to zgodę.

jesteś w: Kurs C++ / Szablony klas
Szkoła Hakerów - Kurs Hackingu Bez Cenzury

Szablony klas

Szablon klas działa na podobnej zasadzie, jak szablon funkcji. Tak więc jeżeli zrozumiałeś na czym polegają szablony funkcji oraz funkcje to praktycznie ten rozdział będzie tylko przypomnieniem. Już wiesz czym są szablony funkcji oraz wiesz jak je tworzyć. Teraz pokażę jakich korzyści dostarczają szablony klas. Definicja szablonu klasy wygląda następująco:

  1. template <class parametr>
  2. class figura
  3. {
  4. parametr wysokosc;
  5. parametr krawedz1;
  6. parametr krawedz2;
  7. };

Powyżej zdefiniowaliśmy sobie klasę szablonową o nazwie figura. Definicja rozpoczyna się słówka template. Dalej w nawiasach trójkątnych określone są parametry szablonu. W naszym przypadku jest tylko jeden parametr. Sama klasa zawiera trzy składniki dowolnego typu. Klasa służy do przechowywania informacji o figurach. Nasza klasa nie reprezentuje żadnego konkretnego obiektu. Jest to klasa abstrakcyjna. Aby utworzyć obiekt należy się trochę namachać. Najpierw trzeba napisać nazwę klasy. Później należy określić typ parametru podając go w nawiasach trójkątnych. Dopiero teraz podajemy nazwę obiektu.

  1. figura<int> trapezik;

Jeżeli taki zapis Cię przeraża to możesz tutaj skorzystać z małego uproszczenia. C++ daje możliwość zastępowania długich i skomplikowanych wyrażeń krótszymi. Służy do tego słówko typedef. Skorzystajmy z niego.

  1. typedef figura<int> figuraI;

Od tej pory wyrażenie figura<int> jest równoznaczne z wyrażeniem figuraI. W naszym przypadku korzystanie ze słówka typedef ma charakter raczej demonstracyjny. Jest ono bardzo przydatne w przypadku długich i złożonych wyrażeń. Dlatego też warto o nim pamiętać. Rozbudujmy trochę naszą klasę figura.

  1. template <class parametr>
  2. class figura
  3. {
  4. private:
  5. parametr wysokosc;
  6. parametr krawedz1;
  7. parametr krawedz2;
  8.  
  9. public:
  10. parametr wez_wysokosc ();
  11. parametr wez_krawedz1 ();
  12. parametr wez_krawedz2 ();
  13.  
  14. void wpisz_wysokosc ();
  15. void wpisz_krawedz1 ();
  16. void wpisz_krawedz2 ();
  17. };

Do naszej klasy dodaliśmy kilka funkcji umożliwiających dostęp do składników nie-publicznych. Zobacz teraz jak są definiowane funkcje składowe szablonu klasy.

  1. template<class parametr>
  2. parametr figura<parametr>::wez_wysokosc ()
  3. {
  4. return wysokosc;
  5. }
  6.  
  7. template<class parametr>
  8. parametr figura<parametr>::wez_krawedz1 ()
  9. {
  10. return krawedz1;
  11. }
  12.  
  13. template<class parametr>
  14. parametr figura<parametr>::wez_krawedz2 ()
  15. {
  16. return krawedz2;
  17. }
  18.  
  19. template<class parametr>
  20. void figura<parametr>::wpisz_wysokosc (parametr wys)
  21. {
  22. wysokosc = wys;
  23. }
  24.  
  25. template<class parametr>
  26. void figura<parametr>::wpisz_krawedz1 (parametr krawedz)
  27. {
  28. krawedz1 = krawedz;
  29. }
  30.  
  31. template<class parametr>
  32. void figura<parametr>::wpisz_krawedz2 (parametr krawedz)
  33. {
  34. krawedz2 = krawedz;
  35. }

Definicja funkcji składowej szablonu klasy trochę przypomina definicję szablonu funkcji. Zaczynamy od słówka template i nawiasów trójkątnych zawierających parametry szablonu. Następnie podajemy rezultat zwracany przez definiowaną funkcję. Dalej jest nazwa klasy wraz z nawiasami trójkątnymi. W nich ponownie umieszczamy wszystkie parametry szablonu. Kolejny jest operator zakresu i wreszcie nazwa funkcji. Zauważ jednak, że po nazwie funkcji podajemy jedynie nazwę parametru! Niema tam już słówka class.

specjalizowana wersja szablonu klas

Tym zagadnieniem już się zajmowaliśmy przy omawianiu szablonów funkcji. Tak się składa, że w przypadku szablonów klas również można tworzyć wersje specjalizowane. Nie będę już wyjaśniał, jakie są z tego korzyści. Pokażę tylko jak to zrealizować.

  1. class figura<int *>
  2. {
  3. //składniki szablonu klas
  4. };

Tak właśnie wygląda specjalizowana wersja szablonu klas. Jak widzisz tutaj już nie stosujemy słówka template. Jest natomiast nazwa klasy, po której umieszczamy konkretny parametr. U nas jest to wskaźnik do typu int. Oczywiście podajemy go w nawiasach trójkątnych.

specjalizowana wersja funkcji składowej szablonu klas

Została nam jeszcze specjalizowana funkcja składowa szablonu klas. Takie funkcje działają w analogiczny sposób, jak funkcje specjalizowane szablonu funkcji. Również składniowo jest tak samo. Jednak dla formalności mały przykład:

  1. void figura<int*>::wpisz_krawedz2 (int * krawedz)
  2. {
  3. krawedz2 = *krawedz;
  4. }

Tutaj również nie podajemy słówka template. Wystarczy nazwa funkcji wraz z określeniem konkretnych parametrów. To właściwie tyle o szablonach. Sam sposób korzystania z klas szablonowych jest analogiczny, jak w przypadku zwykłych klas. Szablony mają jedynie skrócić czas powstawania programu.