K URS JĘZYKA C++ – WYKŁAD 10 (5.05.2014) Szablony.

Slides:



Advertisements
Podobne prezentacje
Funkcje w PHP ABK.
Advertisements

C++ wykład 9 ( ) Szablony.
C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
C++ wykład 13,14,15 (16/23/ ) STL.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Programowanie obiektowe
Standardowa biblioteka języka C++
1 Dzisiejszy wykład Wzorce funkcji Wzorce klas. 2 Wzorce Często pojawia się konieczność pisania podobnych funkcji lub klas operujących na argumentach.
1 Dzisiejszy wykład Wzorce funkcji Wzorce klas Tablica asocjacyjna Składowe statyczne.
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Static, const, volatile.
Generics w .NET 2.0 Łukasz Rzeszot.
Szablony C++ Leszek Mierzejewski.
Funkcje Modularyzacja : program główny , funkcje Funkcje :
Obiektowe metody projektowania systemów
Kurs Pascala – spis treści
C++ wykład 5 ( ) Dziedziczenie.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Ogólne jednostki programowe 1
Metody Programowania Wykład
Podstawy informatyki 2013/2014
Generator analizatorów leksykalnych
Programowanie obiektowe III rok EiT
Programowanie strukturalne i obiektowe
Programowanie obiektowe – zastosowanie języka Java SE
Programowanie obiektowe III rok EiT
Andrzej Repak Nr albumu
Inicjalizacja i sprzątanie
Programowanie obiektowe
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Podstawy informatyki 2013/2014
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe 2013/2014
Wykład 10 typ zbiorowy rekurencja.
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Kurs języka C++ – wykład 13 ( )
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 8 ( )
Kurs języka C++ – wykład 9 ( )
Kurs języka C++ – wykład 5 ( )
K URS JĘZYKA C++ – WYKŁAD 7 ( ) Wyjątki.
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Funkcje w C++ Funkcja – wydzielony fragment kodu użyty w programie (raz lub więcej razy) spełniający określone zadanie, np. obliczenie średniej ocen.
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++ Przeładowanie operatorów Robert Nowak.
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
K URS JĘZYKA C++ – WYKŁAD 6 ( ) Polimorfizm.
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
K URS JĘZYKA C++ – WYKŁAD 14 ( ) Narzędzia programistyczne w STL.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
Podstawy informatyki Szablony funkcji Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty.
STOS. STL (ang. Standard Template Library) jest to biblioteka zawierająca algorytmy, pojemniki, iteratory oraz inne konstrukcje w formie szablonów, gotowe.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
K URS JĘZYKA C++ – WYKŁAD 7 ( ) Konwersje.
Kurs języka C++ – wykład 3 ( )
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Programowanie obiektowe – zastosowanie języka Java SE
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony

S PIS TREŚCI Szablony w programowaniu Definicja szablonu Parametry w szablonie Konkretyzowanie szablonu Przeciążanie szablonów funkcji Dopasowanie i generowanie funkcji szablonowych Szablony funkcji z biblioteki standardowej Użycie argumentów wzorca do specyfikowania strategii Domyślne parametry szablonu Specjalizacja szablonów klas

S ZABLONY Szablon (inaczej wzorzec) to przezroczysta dla programu konstrukcja językowa, na podstawie której kompilator jest w stanie wygenerować zbiór podobnych funkcji lub podobnych klas. Szablon zastępuje w programowaniu żmudne operacje kopiowania, wklejania i drobnych modyfikacji kodu. Szablony są sparametryzowane przede wszystkim za pomocą typów (ale także pewnych wartości).

S ZABLONY Możemy definiować szablony funkcji i klas. Szablony definiuje się umieszczając przed definicją funkcji lub klasy frazę template z listą parametrów w nawiasach kątowych. Przykład: template T maksimum (const T &a, const T &b) { return a<b ? b : a; } na podstawie tej definicji kompilator umie wygenerować funkcję maksimum dla obiektów różnych typów (dla których zdefiniowano operator porównywania operator< ).

O KREŚLENIE TYPU TYPENAME Słowo typename wskazuje, że następujący po nim identyfikator jest nazwą typu. Przykład: template class MyClass { typename T::SubType *ptr; // … }; W przykładzie tym ptr jest wskaźnikiem na obiekt typu T::SubType (a nie iloczynem składowej statycznej T::SubType przez ptr ).

P ARAMETRY SZABLONU Parametr wzorca może być: typem (oznacza się go jako class lub typename), wartością porządkową (może to być char, int itp., oraz wskaźnik), parametrem wzorca. Szablon może mieć wiele parametrów. Przykłady: template class Bufor {…}; template class Schowek {…};

D EFINIOWANIE SZABLONU Wzorzec definiuje się w pliku nagłówkowym, gdyż kompilator musi znać jego definicję aby na jej podstawie wygenerować funkcję lub klasę wzorcową. Wzorzec funkcji lub klasy może się pojawiać wielokrotnie w pliku (poprzez włączenie pliku nagłówkowego) i nie spowoduje błędu (tak jak definicja funkcji wbudowanej).

D EFINIOWANIE SZABLONU Składowe wzorca klasy definiuje się tak samo jak dla zwykłej kasy. Funkcje składowe wzorca można definiować poza klasą (ale tak by kompilator widział te definicje). Składowe wzorca klasy same są wzorcami i są sparametryzowane parametrami swoich wzorców klas.

D EFINIOWANIE SZABLONU Przykład wzorca klasy: template class stos { T tab[rozm]; int ile; public: void wstaw (const T &x) throw(std::out_of_range); T zdejmij () throw(std::out_of_range); int rozmiar () const { return ile; } }; template void stos::wstaw (const T &x) throw(std::out_of_range) { if (ile>=rozm) throw std::out_of_range(”przepełnienie stosu”); tab[ile++] = x; } template T stos::zdejmij () throw(std::out_of_range) { if (ile<=0) throw std::out_of_range(”wyczerpanie stosu”); return tab[--ile]; }

K ONKRETYZOWANIE SZABLONU Funkcja szablonowa to funkcja wygenerowana przez kompilator na podstawie szablonu funkcji. Kompilator wygeneruje funkcję szablonową gdy napotka jej wywołanie lub pobranie adresu funkcji. Kompilator sprecyzuje typ funkcji szablonowej na podstawie jej argumentów wywołania (typ rezultatu jest nieistotny). Można też jawnie wskazać typ funkcji szablonowej. Przykłady: maksimum(x,192); // x jest typu int maksimum (2.72,x); // x jest typu int char (*fun)(char,char) = maksimum; maksimum(x,’x’); // błąd - maksimum(int,char);

S ZABLON FUNKCJI Parametrem szablonu funkcji jest przede wszystkim nazwa typu (wartości zwykle przekazuje się jako argumenty do funkcji). Kompilator wygeneruje funkcję szablonową, gdy napotka jej wywołanie albo gdy w programie używamy adresu takiej funkcji. W szablonie funkcji może wystąpić deklarator inline.

D OPASOWANIE I GENEROWANIE FUNKCJI SZABLONOWYCH Dopasowanie funkcji do szablonu następuje poprzez typy argumentów wywołania funkcji (typ rezultatu nie ma znaczenia). Jawną specyfikację stosuje się często w odniesieniu do typu wyniku. Przykład: template T impl_cast (U u) { return u; } … void fun (int i) { impl_cast(i); // błąd – nieznane T impl_cast (i); // T to double impl_cast (i); // ok impl_cast (i); // błąd – rzutowanie // int na char* }

P RZECIĄŻANIE SZABLONU FUNKCJI Szablon funkcji można przeciążać (podobnie jak samą funkcję). Można zadeklarować kilka wzorców funkcji o takiej samej nazwie, a także kombinację wzorców i zwykłych funkcji. Reguły rozstrzygania przeciążenia w obecności wzorców funkcji są uogólnieniem zwykłych reguł rozstrzygania przeciążenia funkcji: najpierw dla każdego wzorca znajduje się specjalizację, która jest najlepsza dla ciągu argumentów funkcji; następnie stosuje się do tych specjalizacji i wszystkich zwykłych funkcji normalne reguły rozstrzygania przeciążenia.

S ZABLONY FUNKCJI Z BIBLIOTEKI STANDARDOWEJ Szablon min i max (plik nagłówkowy ) do wyznaczania minimum i maksimum spośród pary argumentów. Szablon swap (plik nagłówkowy ) do zamiany wartościami pary obiektów. Dodatkowe operatory porównania, które pracują na podstawie operatorów ) zdefiniowane w przestrzeni nazw std::rel_ops – wystarczy zrobić dyrektywę użycia aby te dodatkowe operatory były dostępne.

U ŻYCIE ARGUMENTÓW WZORCA DO SPECYFIKOWANIA STRATEGII Problem: sortowanie łańcuchów względem różnych kryteriów porównywania. Rozwiązanie: template int porownaj (const Napis &a, const Napis &b) { for (int i=0; i class por { public: static int eq (T a, T b) { return a==b; } static int lt (T a, T b) { return a x, Napis y) { porownaj >(x,y); … }

D OMYŚLNE PARAMETRY SZABLONU Szablon może mieć parametry domyślne (podobnie jak funkcja może mieć argumenty domyślne). Przykład: template > int porownaj (const Napis &a, const Napis &b) {…} Technika dostarczania strategii jako argumentu wzorca jest powszechnie wykorzystywana w bibliotece standardowej. Parametry wzorca służące do dostarczania strategii nazywa się trejtami (ang. traits). Przykładami trejtów są iteratory i alokatory.

S ZABLONY KLAS Przykład szablonu klasy: template class schowek { T tajne; public: schowek (const T &t) : tajne(t) {} schowek & operator= (const schowek s) { if (&s!=this) tajne = s.tajne; return *this; } T wartosc () { return tajne; } }; Przykłady klas szablonowych: schowek pon(3), wto(7); schowek sro(’s’); schowek czw(”czwartek”);

S ZABLONY KLAS Szablon klasy a klasy szablonowe. Parametry formalne szablonu (te w nawiasach kątowych) a parametry aktualne (konkretny typ dla klasy szablonowej). Nazwa szablonu klasy musi być unikalna. Szablon klasy musi mieć zasięg globalny – nie wolno zagnieżdżać definicji jednego szablonu w drugim.

S ZABLONY KLAS Uwaga na składniki statyczne w szablonie. Instrukcje typedef i enum w szablonie klasy. Przyjaźń a szablony klas… przyjaciel ogólny przyjaciel szablonowy zaprzyjaźnione operatory we/wy Dziedziczenie a szablony klas…

S PECJALIZACJA SZABLONÓW KLAS Alternatywne definicje wzorca nazywa się specjalizacjami. Przykład: template class Wektor {…}; template class Wektor {…}; template <> class Wektor {…}; template <> class Wektor {…};

S PECJALIZACJA SZABLONÓW KLAS Tworząc specjalizację szablonu jakiejś klasy, możemy w niej zdefiniować inne pola i metody niż w szablonie ogólnym. Mając wzorzec klasy, można w nim wyspecjalizować tylko wybrane funkcje składowe, zamiast tworzyć specjalizację całej klasy. W rozstrzyganiu przeciążenia preferuje się wersję najbardziej specjalizowaną.

A LIASY SZABLONÓW Możliwe jest definiowanie aliasów dla szablonów, nawet z niezdefiniowanymi parametrami szablonowymi. Przykład: template class SomeType; template using TypedefName = SomeType ;