Zaawansowane programowanie w C++ (PCP)

Podobne dokumenty
Zaawansowane programowanie w C++ (PCP)

Szablony klas, zastosowanie szablonów w programach

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Szablony funkcji i szablony klas

Zaawansowane programowanie w C++ (PCP)

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

Szablony funkcji i klas (templates)

Zaawansowane programowanie w C++ (PCP)

Szablony. Szablony funkcji

Zaawansowane programowanie w C++ (PCP)

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

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

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

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

Programowanie w języku C++

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

Algorytmy i Struktury Danych. Anna Paszyńska

Wzorce funkcji (szablony)

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

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

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie do szablonów klas

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Język C++ wykład VIII

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

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

Zaawansowane programowanie w C++ (PCP)

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Język C++ Programowanie obiektowe

Wykład 8: klasy cz. 4

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

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

Operatory na rzecz typu TString

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Programowanie i struktury danych

STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. deque (double-ended queue) list

PARADYGMATY PROGRAMOWANIA Wykład 3

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

Języki i techniki programowania Ćwiczenia 4 Wzorce

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

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

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

Programowanie obiektowe - 1.

Mechanizm dziedziczenia

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

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

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

Technologie cyfrowe semestr letni 2018/2019

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.

Programowanie obiektowe w C++ Wykład 12

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

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

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

Wstęp do Programowania 2

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Wykład 3 Składnia języka C# (cz. 2)

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Co nie powinno być umieszczane w plikach nagłówkowych:

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Named template parameters

Wyliczanie wyrażenia obiekty tymczasowe

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

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

PROGRAMOWANIE GENERYCZNE W JĘZYKU C++

Przeciążenie operatorów

10. Programowanie obiektowe w PHP5

Podstawy Programowania Obiektowego

Przeciążanie operatorów

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

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Programowanie komputerowe. Zajęcia 5

Programowanie obiektowe

C++11: szablony zewnętrzne C++ 11: C++11: szablony zewnętrzne. C++11: szablony zewnętrzne. C++11: szablony zewnętrzne C++ 11: Szablony zewnętrzne

Abstrakcyjny typ danych

Dziedziczenie. Ogólna postać dziedziczenia klas:

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Dziedziczenie jednobazowe, poliformizm

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

TEMAT : KLASY DZIEDZICZENIE

Paradygmaty programowania. Paradygmaty programowania

Stos liczb całkowitych

Technologie cyfrowe semestr letni 2018/2019

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

Transkrypt:

Zaawansowane programowanie w C++ (PCP) Wykład 6 - szablony. dr inż. Robert Nowak - p. 1/15

Kolekcje i algorytmy» Deklaracja szablonu y Pojęcia niezależne od typu: kolekcje (np. listy) algorytmy (np. znajdowania największego elementu) Mechanizmy eliminujace redundancję kodu. ręczna modyfikacja kodu wspólna a bazowa wykorzystanie szablonów - p. 2/15

Ręczna modyfikacja kodu» Deklaracja szablonu y typedef int Element;//element przykładowego kontenera class WektorInt { public: explicit WektorInt(int size = 10); //konstruktor kopiujący, operator przypisania, destruktor const Element& get(int idx) const;//zwraca element o danym Element& get(int idx);//zwraca element o danym indeksie //... private: Element* tab_;//tablica przechowująca elementy wektora int size_;//liczba elementów int capacity_;//wielkość tablicy }; konieczność ręcznej zmiany kodu (błędy!) utrudnione wprowadzanie modyfikacji (wiele kopii kodu) - p. 3/15

Klasa bazowa» Deklaracja szablonu y #include Object.h class WektorObj { public: explicit WektorInt(int size = 10); //konstruktor kopiujący, operator przypisania, destruktor const Object& get(int idx) const;//zwraca element o danym Object& get(int idx);//zwraca element o danym indeksie //... private: Object** tab_;//tablica przechowująca elementy wektora //... }; Wady: narzuty pamięciowe i czasowe problem typów wbudowanych - p. 4/15

Zastosowanie szablonów» Deklaracja szablonu y tempate<class T> class Wektor { public: explicit Wektor(int size = 10); //konstruktor kopiujący, operator przypisania, destruktor const T& get(int idx) const;//zwraca element o danym indek T& get(int idx);//zwraca element o danym indeksie void add(const T& val);//dodaje element na koniec kolekcji /* Dalsza część interfejsu y */ private: T* tab_;//tablica przechowująca elementy wektora int size_;//liczba elementów int capacity_;//wielkość tablicy }; Wektor<int> v;//kolekcja liczb całkowitych v.add(3); v.add(4);//operacje na kolekcji Wektor<Data> vd;//kolekcja obiektów y Data Wektor<Figura*> vf;//kolekcja wskaźników do y - p. 5/15

Deklaracja szablonu y» Deklaracja szablonu y Deklaracja szablonu: deklaracja-wzorca: template < lista-parametrów-wzorca > deklaracja lista-parametrów-wzorca: parametr-wzorca [,lista-parametrów-wzorca] parametr-wzorca: class identyfikator [= id-typu ] typename identyfikator [= id-typu ] Przykłady: template<class T> class Array { /* oparty o jeden typ */ }; template<typename T, typename U> class Graf{ /* zależny od dwu typów */ }; template<typename T, typename U = int> class BinTree{ /* Domyślny parametr szablonu */ }; - p. 6/15

generowanie typu» Deklaracja szablonu y nazwa-szablonu < typ [,typ] > Przykłady: Array<int> a; std::vector<double> vd; Graf<std::string, std::string> gr; vector<vector<int> > vv; Niejednoznaczności: zbyt bliskie położenie kończacych >, np. vector<vector<int>> v; znak >> jest operatorem przesunięcia prawidłowe vector<vector<int> > v; (dodatkowa spacja) - p. 7/15

Szablony - właściwości» Deklaracja szablonu y Szablony sa mechanizmem czasu kompilacji pozwalaja współdzielić kod źródłowy brak narzutów czasowych w czasie wykonania Organizacja plików źródłowych definicja (a nie tylko deklaracja) szablonu musi być widoczna w miejscu użycia organizacja plików źródłowych Kod nie jest kompilowany, jeżeli nie został użyty - p. 8/15

Przykład: std::pair» Deklaracja szablonu y Definicja znajduje się w <utility> template<class _T1, class _T2> struct pair { typedef _T1 first_type; typedef _T2 second_type; _T1 first;//pierwsza składowa _T2 second;//druga składowa }; pair() : first(), second() { } pair(const _T1& a, const _T2& b) : first( a), second( b) { } Przykłady użycia: std::pair<std::string,bool> a( Ala,true); a.first = Ola ; a.second = false; - p. 9/15

Szablony funkcji» Deklaracja szablonu y Wzorce funkcji: pozwalaja implementować algorytmy niezależne od typu template<typename T> void std::swap(t& a, T& b) { T tmp = a; a = b; b = tmp; } template<typename T> void printall(const vector<t>& v, std::ostream& os) { for(size_t i = 0; i!= v.size(); ++i) os << v[i] << ","; os << endl; } - p. 10/15

Argumenty wzorca funkcji» Deklaracja szablonu y Istnieje możliwość wyznaczania argumentów wzorca z argumentów podanych w wywołaniu template<typename T> void printall(const vector<t>& v, std::ostream& os) { /*... * vector<int> w; //dodanie elementów do wektora printall(w,cout);//printall<int>(w,cout) template<typename T> T* przydziel() { /* Tworzy obiekt i zwraca wskaźnik */ } int* pi = przydziel<int>();//niemożliwa automatyczna specjaliz - p. 11/15

Problem typu» Deklaracja szablonu y Typowy problem - jawne wskazanie, że identyfikator jest typem class Foo { public: typedef int Element; /* dalsza część implementacji y Foo */ }; template<typename T> void f(const T& t) { //Poniżej błędnie zakłada, że T::Element to nazwa składowej T::Element e = 0; //... //Poniżej jawnie wskazano, że T::Element to nazwa typu typename T::Element e = 0; //... }; - p. 12/15

Szablony kontra hierarchia» Deklaracja szablonu y Używaj szablonów gdy: ważne sa typy wbudowane nie można utworzyć wspólnej y podstawowej bardzo ważna jest efektywność akceptowalna jest powtórna kompilacja przy dodawaniu nowego typu W przeciwnym wypadku używaj hierarchii. - p. 13/15

Zasady tworzenia szablonów» Deklaracja szablonu y 1. zaimplementować typ konkretny 2. przetestować go 3. przekształcić go w szablon 4. wygenerować i przetestować kilka różnych typów - p. 14/15

Podział kodu wzorca na pliki» Deklaracja szablonu y Plik kontener.h - definicja y #ifndef KONTENER #define KONTENER template<typename T> class Kontener { /* Definicja y i metod inline */ }; #include kontener_impl.h #endif Plik kontener_impl.h - implementacja metod wzorca //Nie ma zabezpieczeń przed wielokrotnym dołączaniem template<typename T> T& Kontener<T>::get(int index) { /* Definicja metody */ } Plik kontener.cpp - kod niezależny od typu T - p. 15/15