Wprowadzenie do szablonów szablony funkcji

Podobne dokumenty
Wprowadzenie do szablonów szablony funkcji

Szablony funkcji i szablony klas

Wartości domyślne, przeciażenia funkcji

Wartości domyślne, przeciażenia funkcji

Konstruktor kopiujacy

Pola i metody statyczne

Wartości domyślne, szablony funkcji i klas

Wyliczanie wyrażenia obiekty tymczasowe

Style programowania - krótki przeglad

Szablon klasy std::list

Wprowadzenie do szablonów klas

Przesłanianie nazw, przestrzenie nazw

Referencje do zmiennych i obiektów

Operacje wejścia/wyjścia odsłona pierwsza

Rzutowanie i konwersje

Szablon klasy std::vector

Klasa, metody, rozwijanie w linii

Klasa, metody, rozwijanie w linii

Style programowania - krótki przeglad

Szablony funkcji i klas (templates)

Lista dwukierunkowa - przykład implementacji destruktorów

Operacje wejścia/wyjścia (odsłona druga) - pliki

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

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

Przestrzenie nazw. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

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

Szablony. Szablony funkcji

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

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

Podstawy Programowania Obiektowego

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

Obiekty i metody stałe

Qt sygnały i designer

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

Zaawansowane programowanie w C++ (PCP)

Podejście obiektowe - podstawowe pojęcia

Wstęp do Programowania 2

Przykład implementacji przeciażeń operatorów problem kolizji

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

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

Abstrakcyjny typ danych

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

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

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

Do czego służą klasy?

Programowanie Obiektowew języku C++ Zadania L4

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

Język ludzki kod maszynowy

TEMAT : KLASY DZIEDZICZENIE

Wstęp do programowania

Geneza powstania języka C++

Szablony klas, zastosowanie szablonów w programach

Paradygmaty programowania

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

Geneza powstania języka C++

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

KLASY cz.1. Dorota Pylak

Wprowadzenie do programowanie obiektowego w języku C++

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

Do czego służą klasy?

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

Hermetyzacja oraz pola i metody statyczne

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

Programowanie, część I

Wstęp do Programowania 2

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs programowania. Wykład 9. Wojciech Macyna

Praca z aplikacją designer

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Wprowadzenie do UML, przykład użycia kolizja

Przykład zastosowania przeciażeń operatorów i metod stałych - szukanie punktu przecięcia z wielobokiem

Zaawansowane programowanie w C++ (PCP)

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Aplikacja po polsku. Bogdan Kreczmer. ZPCiR ICT PWr pokój 307 budynek C3.

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

Programowanie w języku C++

Wstęp do programowania obiektowego. Wykład 2

Diagramy UML, przykład problemu kolizji

Stos liczb całkowitych

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

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

Organizacja kursu, paradygmaty, ogólnie o C i C++

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

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Programowanie, część I

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

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

Wstęp do Programowania 2

Wyjątki (exceptions)

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Wzorce funkcji (szablony)

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie obiektowe w C++ Wykład 12

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

Transkrypt:

Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji.

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji. Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji. Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów. Możliwe rozwiazania:

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji. Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów. Możliwe rozwiazania: Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego zastosowanie.

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji. Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów. Możliwe rozwiazania: Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego zastosowanie. Implementacja algorytmu dla typu podstawowego takiego jak void lub Object.

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji. Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów. Możliwe rozwiazania: Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego zastosowanie. Implementacja algorytmu dla typu podstawowego takiego jak void lub Object. Zdefiniowanie makr i wykorzystanie specjalnych preprocesorów (np. C/C++). cpp dla

Separacja kodu i typów 1 W językach takich jak C i Pascal mamy do czynienia z separacja kodu i typu parametrów. Wartości z jakimi wywoływane sa funkcje i procedury moga parametryzować ich działanie. Jednak ich typy zostaja ustalone raz na zawsze w momencie ich definicji. Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów. Możliwe rozwiazania: Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego zastosowanie. Implementacja algorytmu dla typu podstawowego takiego jak void lub Object. Zdefiniowanie makr i wykorzystanie specjalnych preprocesorów (np. C/C++). cpp dla Najlepszym rozwiazaniem dla postawionego problemu jest koncepcja szablonów.

Podstawowe cechy 2 Szablony pozwalaja na definiowanie funkcji, których typy parametrów sa także parametrami tych funkcji.

Podstawowe cechy 2 Szablony pozwalaja na definiowanie funkcji, których typy parametrów sa także parametrami tych funkcji. Możliwe jest definiowanie klas, które parametryzowane moga być typami pól występujacych w tych klasach i/lub też typami parametrów metod.

Podstawowe cechy 2 Szablony pozwalaja na definiowanie funkcji, których typy parametrów sa także parametrami tych funkcji. Możliwe jest definiowanie klas, które parametryzowane moga być typami pól występujacych w tych klasach i/lub też typami parametrów metod. Programista definiuje tylko raz dany szablon. Kompilator dokonuje dedukcji typów parametrów danego szablonu i konkretyzuje go tworzac kod dla użytych typów w wywołaniu funkcji lub definicji obiektu danej klasy.

Podstawowe cechy 2 Szablony pozwalaja na definiowanie funkcji, których typy parametrów sa także parametrami tych funkcji. Możliwe jest definiowanie klas, które parametryzowane moga być typami pól występujacych w tych klasach i/lub też typami parametrów metod. Programista definiuje tylko raz dany szablon. Kompilator dokonuje dedukcji typów parametrów danego szablonu i konkretyzuje go tworzac kod dla użytych typów w wywołaniu funkcji lub definicji obiektu danej klasy. Programista może też jawnie określić wartości parametrów szablonu.

Podstawowe cechy 3 Zalety:

Podstawowe cechy 3 Zalety: Szablony daja możliwość tworzenia uniwersalnych algorytmów i uniwersalnych struktur danych.

Podstawowe cechy 3 Zalety: Szablony daja możliwość tworzenia uniwersalnych algorytmów i uniwersalnych struktur danych. W odróżnieniu od makr możliwe jest zachowanie przejrzystości kodu.

Podstawowe cechy 3 Zalety: Szablony daja możliwość tworzenia uniwersalnych algorytmów i uniwersalnych struktur danych. W odróżnieniu od makr możliwe jest zachowanie przejrzystości kodu. W odróżnieniu od wykorzystywania typów bazowych pozwalaja zachować ścisła kontrolę typów w trakcie kompilacji.

Podstawowe cechy 3 Zalety: Szablony daja możliwość tworzenia uniwersalnych algorytmów i uniwersalnych struktur danych. W odróżnieniu od makr możliwe jest zachowanie przejrzystości kodu. W odróżnieniu od wykorzystywania typów bazowych pozwalaja zachować ścisła kontrolę typów w trakcie kompilacji. Wady:

Podstawowe cechy 3 Zalety: Szablony daja możliwość tworzenia uniwersalnych algorytmów i uniwersalnych struktur danych. W odróżnieniu od makr możliwe jest zachowanie przejrzystości kodu. W odróżnieniu od wykorzystywania typów bazowych pozwalaja zachować ścisła kontrolę typów w trakcie kompilacji. Wady: Brak możliwości tworzenia oddzielnych jednostek kompilacji (modułów) w postaci czystych szablonów.

Szablon funkcji 4 template <class Typ> Typ max( Typ w1, Typ w2 ) return w1 < w2? w2 : w1; enum Symbole a=1, b, c ; int main( ) cout << max(1,2) << endl; cout << max(1.1, 2.2) << endl; cout << max( A, B ) << endl; cout << max( a, b ) << endl;

Szablon funkcji 4 template <class Typ> Typ max( Typ w1, Typ w2 ) return w1 < w2? w2 : w1; enum Symbole a=1, b, c ; int main( ) cout << max(1,2) << endl; cout << max(1.1, 2.2) << endl; cout << max( A, B ) << endl; cout << max( a, b ) << endl; Wynik działania: 2 2.2 B 2

Szablon funkcji 4 template <class Typ> Typ max( Typ w1, Typ w2 ) return w1 < w2? w2 : w1; enum Symbole a=1, b, c ; int main( ) cout << max(1,2) << endl; cout << max(1.1, 2.2) << endl; cout << max( A, B ) << endl; cout << max( a, b ) << endl; Wynik działania: 2 2.2 B 2 W tym przykładzie kompilator generuje kod funkcji max dla czterech przypadków. Słowo kluczowe class może zostać zastapione przez typename.

Szablon funkcji 5 struct Wektor //.................................................................... float x, y; Wektor( float x = 0, float y = 0 ): x(x), y(y) bool operator < ( const Wektor& W ) const return x x+ y y < W. x W. x+w. y W. y; ; //................................................................................... template < typename Typ > Typ max( Typ w1, Typ w2 ) return w1 < w2? w2 : w1; int main( ) Wektor W1(1,1), W2(-2,1); W1 = max( W1, W2 ); cout << W1. x <<, << W1. y << endl;

Szablon funkcji 5 struct Wektor //.................................................................... float x, y; Wektor( float x = 0, float y = 0 ): x(x), y(y) bool operator < ( const Wektor& W ) const return x x+ y y < W. x W. x+w. y W. y; ; //................................................................................... template < typename Typ > Typ max( Typ w1, Typ w2 ) return w1 < w2? w2 : w1; int main( ) Wektor W1(1,1), W2(-2,1); W1 = max( W1, W2 ); cout << W1. x <<, << W1. y << endl; Wynik działania: -2, 1

Szablon funkcji 5 struct Wektor //.................................................................... float x, y; Wektor( float x = 0, float y = 0 ): x(x), y(y) bool operator < ( const Wektor& W ) const return x x+ y y < W. x W. x+w. y W. y; ; //................................................................................... template < typename Typ > Typ max( Typ w1, Typ w2 ) return w1 < w2? w2 : w1; int main( ) Wektor W1(1,1), W2(-2,1); W1 = max( W1, W2 ); cout << W1. x <<, << W1. y << endl; Wynik działania: -2, 1 Szablon funkcji można wykorzystywać dla własnych klas, o ile wszystkie realizowane w nim operacje będa legalne.

Szablon funkcji 6 template <typename Typ> Typ max( Typ w1, Typ w2 ) return cout << S:, w1 < w2? w2 : w1; const char max( const char s1, const char s2 ) return cout << F:, std::strcmp(s1,s2) < 0? s2 : s1; int main( ) cout << max( Abacki, Kowalski ) << endl; cout << max<const char >( Abacki, Kowalski ) << endl; cout << max<>( Abacki, Kowalski ) << endl;

Szablon funkcji 6 template <typename Typ> Typ max( Typ w1, Typ w2 ) return cout << S:, w1 < w2? w2 : w1; const char max( const char s1, const char s2 ) return cout << F:, std::strcmp(s1,s2) < 0? s2 : s1; int main( ) cout << max( Abacki, Kowalski ) << endl; cout << max<const char >( Abacki, Kowalski ) << endl; cout << max<>( Abacki, Kowalski ) << endl; Wynik działania: F: Kowalski S: Abacki S: Abacki

Szablon funkcji 6 template <typename Typ> Typ max( Typ w1, Typ w2 ) return cout << S:, w1 < w2? w2 : w1; const char max( const char s1, const char s2 ) return cout << F:, std::strcmp(s1,s2) < 0? s2 : s1; int main( ) cout << max( Abacki, Kowalski ) << endl; cout << max<const char >( Abacki, Kowalski ) << endl; cout << max<>( Abacki, Kowalski ) << endl; Wynik działania: F: Kowalski S: Abacki S: Abacki Funkcje zdefiniowane przez szablony moga być przeciażone zwykłymi funkcjami. Można jednak wymusić użycie funkcji zdefiniowanej przez szablon.

Szablon funkcji 7 template <typename Typ> Typ max( Typ w1, Typ w2 ) return cout << S:, w1 < w2? w2 : w1; template <> const char max<const char >(const char s1, const char s2) return cout << F:, std::strcmp(s1,s2) < 0? s2 : s1; int main( ) cout << max( Abacki, Kowalski ) << endl; cout << max<const char >( Abacki, Kowalski ) << endl; cout << max<>( Abacki, Kowalski ) << endl;

Szablon funkcji 7 template <typename Typ> Typ max( Typ w1, Typ w2 ) return cout << S:, w1 < w2? w2 : w1; template <> const char max<const char >(const char s1, const char s2) return cout << F:, std::strcmp(s1,s2) < 0? s2 : s1; int main( ) cout << max( Abacki, Kowalski ) << endl; cout << max<const char >( Abacki, Kowalski ) << endl; cout << max<>( Abacki, Kowalski ) << endl; Wynik działania: F: Kowalski F: Kowalski F: Kowalski

Szablon funkcji 7 template <typename Typ> Typ max( Typ w1, Typ w2 ) return cout << S:, w1 < w2? w2 : w1; template <> const char max<const char >(const char s1, const char s2) return cout << F:, std::strcmp(s1,s2) < 0? s2 : s1; int main( ) cout << max( Abacki, Kowalski ) << endl; cout << max<const char >( Abacki, Kowalski ) << endl; cout << max<>( Abacki, Kowalski ) << endl; Wynik działania: F: Kowalski F: Kowalski F: Kowalski Można tworzyć specjalizację szablonu funkcji dla wybranego typu.