Programowanie obiektowe. Wykład 5. C++: szablony

Podobne dokumenty
Szablony. Szablony funkcji

Szablony funkcji i szablony klas

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Abstrakcyjny typ danych

Szablony funkcji i klas (templates)

Stos liczb całkowitych

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Szablony klas, zastosowanie szablonów w programach

Podstawy Programowania Obiektowego

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w języku C++

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Wyjątki (exceptions)

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie 2. Język C++. Wykład 3.

Wstęp do programowania obiektowego, wykład 7

C++ Przeładowanie operatorów i wzorce w klasach

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wprowadzenie do szablonów klas

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wstęp do programowania

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Programowanie Obiektowew języku C++ Zadania L4

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Język C++ wykład VIII

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Programowanie Obiektowe i C++

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe w języku

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie 2. Język C++. Wykład 9.

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy Programowania Obiektowego

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Identyfikacje typu na etapie. wykonania (RTTI)

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Programowanie obiektowe i zdarzeniowe

Wartości domyślne, przeciażenia funkcji

TEMAT : KLASY DZIEDZICZENIE

Wartości domyślne, przeciażenia funkcji

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Język C++ Programowanie obiektowe

dr inż. Jarosław Forenc

Pola i metody statyczne

Podstawy programowania w języku C++

Wykład 4: Klasy i Metody

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe w C++ Wykład 07 Temat wiodący: Wzorce (szablony) klas, polimorfizm, funkcje wirtualne. Wzorce

Wykład 5: Więcej o Klasach i Metodach

Programowanie Obiektowew języku C++ Zadania L4

Programowanie - wykład 4

TEMAT : KLASY POLIMORFIZM

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Wykład 5: Klasy cz. 3

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Zaawansowane programowanie w C++ (PCP)

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Wstęp do programowania

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Dziedziczenie. Ogólna postać dziedziczenia klas:

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Kurs WWW. Paweł Rajba.

Języki i paradygmaty programowania

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

C++ - [4-7] Polimorfizm

Wyliczanie wyrażenia obiekty tymczasowe

Zaawansowane programowanie w języku C++ Klasy w C++

Listy powiązane zorientowane obiektowo

Wykład 8: klasy cz. 4

Wykład 9: Polimorfizm i klasy wirtualne

Transkrypt:

Programowanie obiektowe Wykład 5. C++: szablony

Szablony Szablony to technika realizacji polimorfizmu na innym poziomie niż za pomocą funkcji wirtualnych i dziedziczenia. Mechanizm ten można rozumieć jako inteligentniejsze makrodefinicje. Szablony nie są w bezpośredni sposób związane z programowaniem obiektowym.

Szablony funkcji przykład problemu: definiujemy funkcję porównującą......liczby całkowite: int compare(int a, int b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;

Szablony funkcji przykład problemu: definiujemy funkcję porównującą......liczby całkowite: int compare(int a, int b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...liczby rzeczywiste: int compare(float a, float b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;

Szablony funkcji przykład problemu: definiujemy funkcję porównującą......liczby całkowite: int compare(int a, int b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...liczby rzeczywiste: int compare(float a, float b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...itaksamodlakażdegoinnegotypu

Szablony funkcji przykład problemu: definiujemy funkcję porównującą......liczby całkowite: int compare(int a, int b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...liczby rzeczywiste: int compare(float a, float b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...itaksamodlakażdegoinnegotypu... pod warunkiem, że ma zdefiniowany operator <

Szablony funkcji przykład problemu: definiujemy funkcję porównującą......liczby całkowite: int compare(int a, int b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...liczby rzeczywiste: int compare(float a, float b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;...pudełka class Pudelko public: float dl,sz,wy; Pudelko(float d,floats,floatw):dl(d),sz(s),wy(w) int operator<(pudelko& p) return dl*sz*wy < p.dl*p.sz*p.wy; ; int compare(pudelko a, Pudelko b) if(a<b)return1;elseif(b<a) return-1;elsereturn0;

Szablony funkcji podstawowe informacje szablon funkcji jest sparametryzowaną definicją funkcji szablon funkcji definiuje się w zakresie globalnym parametrem szablonu funkcji jest typ(klasa), bądź lista typów wszystkie parametry szablonu muszą wystąpić w opisie argumentów funkcji szablonowej(kompilator odnajduje szablon na podstawie wywołania funkcji) Składnia: template< opis parametrów > definicja funkcji

Szablony funkcji przykład class Pudelko public: float dl,sz,wy; Pudelko(float d,floats,floatw):dl(d),sz(s),wy(w) int operator<(pudelko& p) return dl*sz*wy < p.dl*p.sz*p.wy; ; template <class T> intcompare(t a,tb) if(a<b) return-1; else if(b<a) return 1; else return 0; intmain() cout << compare(1,2) << endl //-1 << compare(1.5,2.5) << endl //-1 <<compare( a, b ) <<endl //-1 << compare(pudelko(1.0,2.0,2.0),pudelko(2.0,1.5,4.2)) << endl;//-1

Szablony funkcji parametry parametrem szablonu funkcji jest typ(klasa), bądź lista typów wszystkie parametry szablonu muszą wystąpić w opisie argumentów funkcji szablonowej(kompilator odnajduje szablon na podstawie wywołania funkcji) oprócz obowiązkowego użycia parametrów szablonu w opisie argumentów funkcji szablonowej, można ich używać w dowolnym miejscu w definicji tej funkcji(jako nazwy typu). template<class S, class T> T* jakasfunkcja(s a, T b) T*l=new(T); int r=sizeof(s);... return l;

Szablony funkcji jedynym ograniczeniem, jakie w definicji szablonu można nałożyć na typy argumetów funkcji szablonowej jest by niektóre z nich były takie same, np. szablon template<class K,class L,class M> voidf(ka,lb,kc,md)... pasuje do wywołania f(3, e,5,"ala") ale do wywołania nie. f(3, e, a,"ala")

Szablony funkcji jak to działa natrafiając na wywołanie funkcji, kompilator sprawdza, czy istnieje funkcja o podanej nazwie, liczbie i typie argumentów jeśli nie, sprawdza, czy istnieje szablon pozwalający taką funkcję wygenerować, jeśli tak generuje odpowiednią funkcję jeśli nie, sprawdza czy isnieje funkcja którą można dopasować dokonując konwersji typów argumentów, jeśli tak, dokonuje wiązania z zastosowaniem konwersji typów

Szablony funkcji sytuacje wyjątkowe często zdarza się, że funkcje wygenerowane z szablonu będą działać poprawnie(lub w ogóle będą poprawne) w większości przypadków, ale nie we wszystkich szablon z poprzedniego przykładu nie będzie działał poprawnie dla typu char* nienadajesięonwogólenp.dlatypu classdata public: int dzien, miesiac, rok; zawzględunabrakoperatora< cout << compare(1,2) << endl //-1 << compare(1.5,2.5) << endl //-1 <<compare( a, b ) <<endl //-1 << compare(pudelko(1.0,2.0,2.0),pudelko(2.0,1.5,4.2)) << endl//-1 <<compare("ala","ola") <<endl //1 (!) <<compare((string)"ala",(string)"ola") <<endl; //-1

Szablony funkcji funkcje specjalizowane wyjątki od sposobu generownia funkcji zdefiniowanego przez szablon można zdefiniować pisząc funkcję specjalizowaną funkcja specjalizowana to funkcja, której nazwa i typy parametrów pasują do szablonu, tyle że jest jest to normalna funkcja

Szablony funkcji funkcje specjalizowane template <class T> intcompare(t a,tb) if(a<b) return-1; else if(b<a) return 1; else return 0; int compare(const char* a, const char* b) return strcmp(a,b); intmain() cout << compare(1,2) << endl //-1 << compare(1.5,2.5) << endl //-1 <<compare( a, b ) <<endl //-1 << compare(pudelko(1.0,2.0,2.0),pudelko(2.0,1.5,4.2)) << endl//-1 <<compare("ala","ola") <<endl //-1 <<compare((string)"ala",(string)"ola") <<endl; //-1

podstawowe informacje szablon klasy jest sparametryzowaną definicją klasy szablon klasy definiuje się w zakresie globalnym Składnia: template< opis parametrów > class nazwaklasy... ;

przykład(bardzo typowy) Szablon klasy Stos, którego parametrem jest typ elementów przechowywanych na stosie. template <class T> class Stos public: Stos():n(0) Stos& push(t e) dane[n++]=e; return*this;// dodanie elementu Tpop() returndane[--n]; //pobranie elementu int empty() return n==0; // test czy pusty operator int() return n; // dodatkowy bajer private: Tdane[100]; intn; ;

klasa szablonowa po zdefniowaniu szablonu klas template< opis parametrów > class nazwaklasy... ; nazwą klasy szablonowej jest nazwaklasy<parametry> posługujemy się nią jak zwykłymi nazwami klas/typów w momencie napotkania takiej nazwy, kompilator generuję definicję klasy szablonowej dla podanych parametrów(jeśli wcześniej już tego nie zrobił)

użycie klasy szblonowej intmain() Stos<char> stosznakow; // generowana jest klasa Stos<char> // generowana jest klasa Stos<int> Stos<int> stosliczb; stosznakow.push( A ).push( l ).push( a ); stosliczb.push(1).push(2).push(3); Stos<char> drugistosznakow=stosznakow; // klasa Stos<char> już jest while(stosznakow) cout << stosznakow.pop(); cout << endl; while(stosliczb) cout << stosliczb.pop(); cout << endl; // bajer

parametry Szablon klasy może mieć wiele parametrów(separatorem jest przecinek) Parametrem szablonu klasy może być: typ(classnazwa) wartośćcałkowitastała(int nazwa) template<classtyp,introzmiar> takżestałewyrażeniebędąceadresemobiektuglobalnegolub funkcji globalnej(rzadsze zastosowanie)

definicje metod klasy szablonowej poza ciałem klasy definicje metod klasy szablonowej umieszczone poza ciałem klasy są w istocie szablonami definicji metod mają postać taką jak szablony funkcji, z tą oczywiście różnicą, że ich nazwę poprzedza się nazwą klasy szablonowej podobnie też jak w przypadku szablonów funkcji, można definiować metody specjalizowane

definicje metod klasy szablonowej poza ciałem klasy template <class T> class Stos public: Stos(); Stos& push(t e); Tpop(); itd private: Tdane[100]; intn; ; template<class T> Stos<T>::Stos() :n(0) template<class T> Stos<T>& Stos<T>::push(T e) dane[n++]=e; return*this; template<class T> TStos<T>::pop() returndane[--n]; itd.

definicje metod klasy szablonowej poza ciałem klasy (lupa) sątoszablonymetod template<class T> Stos<T>::Stos() :n(0) template<class T> Stos<T>& Stos<T>::push(T e) dane[n++]=e; return*this; template<class T> TStos<T>::pop() returndane[--n]; itd.

definicje metod klasy szablonowej poza ciałem klasy (lupa) nieodłączną częścią nazwy klasy szablonowej jest parametr(y) template<class T> Stos<T>::Stos() :n(0) template<class T> Stos<T>& Stos<T>::push(T e) dane[n++]=e; return*this; template<class T> TStos<T>::pop() returndane[--n]; itd.

definicje metod klasy szablonowej poza ciałem klasy (lupa) nazwa konstruktora(destruktora) nie jest nazwą klasy bez parametu template<class T> Stos<T>::Stos() :n(0) template<class T> Stos<T>& Stos<T>::push(T e) dane[n++]=e; return*this; template<class T> TStos<T>::pop() returndane[--n]; itd.

parametry nie będące typami przykład W szablonie stosów dodajemy parametr określający rozmiar. template <class T, int max> class Stos public: Stos():n(0) Stos& push(t e) dane[n++]=e; return*this; Tpop() returndane[--n]; intempty() returnn==0; operatorint() returnn; private: Tdane[max]; intn; ; intmain() Stos<char,20> stos; stos.push( A ).push( l ).push( a ); while(stos) cout<<stos.pop(); cout << endl;

klasa szablonowa jako klasa bazowa Klasa szablonowa może być klasą bazową innej klasy. Klasa szablonowa może być klasą bazową w szablonie klasy. template<class T> class K... ; classl:k<int>... template<class S> classm:k<int>...

klasa szablonowa jako klasa bazowa Klasa szablonowa może być klasą bazową innej klasy. Klasa szablonowa może być klasą bazową w szablonie klasy. template<class T> class K... ; classl:k<int>... template<class S> classm:k<int>...

szablon klasy jako klasa bazowa szablonuklasymożnaużyćjakoklasybazowejwinnym szablonie klasy parametry szablonu klasy bazowej muszą być parametrami szablonu klasy pochodnej albo muszą mieć ustaloną wartość template<class T, int max> class Stos... ; template<class S, int max> class lepszystos : K<S,max>... template<class S> class stosstulementowy : K<S,100>...

szablon klasy jako klasa bazowa szablonuklasymożnaużyćjakoklasybazowejwinnym szablonie klasy parametry szablonu klasy bazowej muszą być parametrami szablonu klasy pochodnej albo muszą mieć ustaloną wartość template<class T, int max> class Stos... ; template<class S, int max> class lepszystos : K<S,max>... template<class S> class stosstulementowy : K<S,100>...

składowe statyczne klas szablonowych Każda instancja klasy szablonowej ma swój komplet składowych statycznych.