1 Wzorce
2 Wzorce klas – dlaczego? Pisząc programy często korzystamy z abstrakcyjnych typów danych, takich jak stos, kolejka czy drzewo. Implementacje takich typów mogą być prawie identyczne, na przykład klasy lista_liczb i lista_znaków mogą różnić się tylko typem elementu przechowywanego na liście. Wzorzec klasy to sposób na napisanie uogólnionej . sparametryzowanej klasy — klasy której parametrem będzie typ, bądź inna klasa. Można napisać wzorzec listy, a potem w zależności od tego czego aktualnie potrzebujemy zadeklarować listę znaków, bądź listę figur. Wzorce są doskonalszym i wygodniejszym sposobem (od stosowania preprocesora) tworzenia rodzin typów i funkcji. Wzorce nazywane są również szablonami (ang. templates).
3 Wzorce klas – jak deklarować?template
4 Wzorce klas – jak deklarować?template
5 Wzorce klas – jak deklarować?Mając wzorzec klasy stos można deklarować stosy różnych elementów przekazując typ elementu jako aktualny parametr wzorca. Składnia nazwy typu wywiedzionego ze wzorca jest następująca: nazwa_klasy_wzorca
6 stos
7 stos
8 Wzorce Kompilator sprawdza poprawność wzorca w momencie jego użycia, a więc błędy w samej deklaracji wzorca mogą pozostać niezauważone aż do momentu próby wykorzystania wzorca. Poprawna kompilacja pliku zawierającego wzorzec nie oznacza że wzorzec nie zawiera błędów. Częstą praktyką jest najpierw uruchomienie konkretnej klasy, np. stos_znaków, a potem przekształcenie jej w klasę ogólną - wzorzec stos
9 Wzorce W wcześniejszej wersji wzorca wszystkie metody są inline — zdefiniowano je wewnątrz deklaracji klasy. Można we wzorcu nie definiować metod: template
10 Wzorce Jeżeli metody wzorca definiujemy poza definicją klasy wzorca to musimy użyć dla każdej z metod słowa kluczowego template: // definicja metody wstaw template
11 template
12 Rozbudowywanie klas-wzorcówWzorca który jest już napisany i wykorzystywany nie należy modyfikować — modyfikacje te będą dotyczyły wszystkich klas stworzonych w oparciu o ten wzorzec. Gdy dodamy zmienne klasowe to powiększą się obiekty wszystkich tych klas wywiedzionych ze wzorca. Gdy zmienimy definicje metod to zmiany będą dotyczyły wsystkich klas wywiedzionych ze wzorca. Zatem, zamiast modyfikacji wzorca danej klasy należy utworzyć wzorzec klasy pochodnej, o nowych właściwościach.
13 Rozbudowywanie klas-wzorcówNp.: potrzebujemy stosu łańcuchów z możliwością zapisu i odczytu do pliku template
14 Wzorzec szczegółowy Jeżeli wzorzec działa niepoprawnie dla jakiegoś szczególnego parametru, to można zdefiniować inną wersję wzorca dla konkretnego parametru. Np. klasa która służy do porównywania elementów danego typu: template
15 Wzorzec szczegółowy Dla łańcuchów (char *) porównywane by były nie łańcuchy, ale ich adresy, więc definiujemy szczególną postać wzorca klasy porównywacz dla łańcuchów: class porównywacz
16 Argumenty wzorca Argumentów wzorca może być wiele, oprócz klas i typów mogą to być napisy, nazwy funkcji lub wyrażenia stałe. Np. wzorzec bufora, którego parametrem będzie rozmiar: template
17 Wzorce Dwa typy wygenerowane ze wspólnego wzorca są identyczne jeżeli identyczne są argumenty wzorca, w przeciwnym przypadku są różne i nie wiąże ich pokrewieństwo. Na przykład dla następujących deklaracji tylko obiekty tbc0 i tbc1 należą do tej samej klasy (klasy bufor
18 Wzorce funkcji template
19 Wzorce funkcji - przykładnapisać rodzinę funkcji zwiększających wartość swojego pierwszego argumentu aktualnego o wartość drugiego argumentu (oba to typy liczbowe) template
20 Wzorce funkcji - przykładnapisać rodzinę funkcji zwiększających wartość swojego pierwszego argumentu aktualnego o wartość drugiego argumentu (oba to typy liczbowe), lub o 1 gdy nie podano drugiego argumentu. // template
21 Wzorce funkcji - przykładnapisać rodzinę funkcji zwiększających wartość swojego pierwszego argumentu aktualnego o wartość drugiego argumentu (oba to typy liczbowe), lub o 1 gdy nie podano drugiego argumentu. template