Szablony funkcji i klas (templates)

Podobne dokumenty
Wyjątki (exceptions)

Wprowadzenie do szablonów szablony funkcji

Szablony funkcji i szablony klas

Wprowadzenie do szablonów szablony funkcji

Szablony. Szablony funkcji

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

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

Podstawy Programowania Obiektowego

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

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

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

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

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

Aplikacje w środowisku Java

Zaawansowane programowanie w C++ (PCP)

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

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

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

TEMAT : KLASY DZIEDZICZENIE

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

Szablony klas, zastosowanie szablonów w programach

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

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

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

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

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

Abstrakcyjny typ danych

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

Wzorce funkcji (szablony)

PARADYGMATY PROGRAMOWANIA Wykład 4

Aplikacje w środowisku Java

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

Język C++ wykład VIII

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

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

Kurs programowania. Wykład 9. Wojciech Macyna

Wstęp do Programowania 2

Wprowadzenie do szablonów klas

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Listy powiązane zorientowane obiektowo

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

Projektowanie obiektowe. Roman Simiński Polimorfizm

Programowanie obiektowe

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

Przeciążanie operatorów

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Laboratorium nr 10. Temat: Funkcje cz.2.

Metody Metody, parametry, zwracanie wartości

Wstęp do programowania

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

Stos liczb całkowitych

TEMAT : KLASY POLIMORFIZM

Wstęp do programowania. Wykład 1

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

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

Typy sparametryzowane

JAVA W SUPER EXPRESOWEJ PIGUŁCE

STL: Lekcja 1&2. Filozofia STL

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

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

Technologie obiektowe

Wstęp do programowania

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

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 2. Język C++. Wykład 3.

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

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

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

Czym są właściwości. Poprawne projektowanie klas

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

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

Wartości domyślne, szablony funkcji i klas

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Język C++ zajęcia nr 2

Paradygmaty programowania

Style programowania - krótki przeglad

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

Zadanie 2: Arytmetyka symboli

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

Programowanie w języku C++

Pytania sprawdzające wiedzę z programowania C++

Programowanie Obiektowe Ćwiczenie 4

Programowanie i struktury danych

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

Materiały do zajęć VII

Języki programowania, wtorek , 12:15-13:45 Zadanie 11 - ostatnie

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Język C, tablice i funkcje (laboratorium, EE1-DI)

Wykład 5: Klasy cz. 3

Laboratorium 1 - Programowanie proceduralne i obiektowe

Przekazywanie argumentów wskaźniki

Programowanie obiektowe

Wprowadzenie do języka Java

Transkrypt:

Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek

Wstęp Szablony (ang. Templates) w innych obiektowych językach programowania (Java, C#) nazywane też Typami Generycznymi (ang. Generic Types) lub Typami Uogólnionymi to element języka C++ pozwalający na tworzenie kodu niezależnego od typów, algorytmów oraz struktur danych. Szablony są techniką realizacji polimorfizmu na innym poziomie niż za pomocą funkcji wirtualnych i dziedziczenia. Mechanizm szablonów można rozumieć jako pewną formę makrodefinicji (preprocesora). Szablony ze względu na szerokie rozpowszechnienie się zastosowań biblioteki STL (ang. Standard Template Library) uważane są za jedną z najważniejszych właściwości języka C++. Dzięki szablonom mamy możliwości programowania ogólnego (ang. generic programming). Tworząc szablon funkcji (podobnie jak szablon klasy) tworzymy kod działający na nieopisanych jeszcze typach funkcja działa na typach ogólnych (które nie istnieją w języku C++), w momencie wywołania funkcji pod te typy ogólne podstawiane są konkretne typy, jak np. int czy char. Przekazujemy szablonowi typy jako parametry, podczas kompilacji następuje tak zwana konkretyzacja szablonu (ang. template instantiation), podczas której kompilator na podstawie typów danych przekazanych wzorcowi generuje docelowy kod do obsługi danego typu. Przykłady implementacji tej samej funkcji dla różnych typów (bez użycia szablonów): // Wersja 1 int: void Zamień(int &x, int &y) { int temp = x; // Wersja 2 double: void Zamień(double &x, double &y) { double temp = x; // Wersja 3 string: void Zamień(string &x, string &y) { string temp = x;

Dzięki wykorzystaniu szablonów programista C++ może skupić się bardziej na algorytmach niż na danych jakie są przetwarzane. Użycie szablonów pozwala zredukować ilość nadmiarowego kodu ponieważ jedną funkcjonalność można zaprogramować dla wielu typów danych. Następnie kompilator w konkretnym przypadku precyzuje te typy i odpowiednio dostosowuje np. wywołania funkcji, metod lub tworzenia obiektów na podstawie klas. Wadą działanie szablonów w języku C++ jest to że przypominają one bardzo zaawansowane makra preprocesora. Powoduje to, że kompilator ma zasadnicze trudności z wygenerowaniem prawidłowych, czytelnych komunikatów diagnostycznych w przypadku błędnego użycia poprawnego szablonu. Szablony w C++ możemy podzielić na: Szablony funkcji, Szablony klas. Szablony funkcji Szablon funkcji to mechanizm umożliwiający automatyczną generację funkcji. Jest to schemat, według którego postępuje kompilator. Programista dostarcza jedynie ogólny zarys ciała funkcji bez określania konkretnych argumentów wywołania. Na tej podstawie kompilator jest w stanie wytworzyć dowolną ilość funkcji działających identycznie, a różniących się jedynie typem argumentów funkcji. Szablony zezwalają na definiowanie całych rodzin funkcji, które następnie mogą być używane dla różnych typów argumentów. Definicja szablonu funkcji wygląda następująco: template <typename T> T MojaFunkcja(T a, T b,...) { //instrukcje... lub template <class T> T MojaFunkcja(T &a, T &b,...) { //instrukcje... Definicja umieszczona bezpośrednio przed definicją funkcji informuje że funkcja będzie korzystała z fikcyjnego typu o nazwie T. Definicja dotyczy tylko pojedynczej funkcji zdefiniowanej bezpośrednio po frazie template.

Przykłady implementacji funkcji dla różnych typów z użyciem szablonów: // Listing 1 template <typename T> T Sprawdz(T a, T b) { return (a>b)?a:b; // Listing 2 template <typename T> T Minimum(T a, T b, T c) { if (a <= b && a <= c) return(a); if (b <= a && b <= c) return(b); return(c); // Listing 3 template <class T> void Zamień(T &x, T &y) { T temp = x; Wyrażenie template<typename T> lub template<class T> oznacza, że mamy do czynienia z szablonem, który posiada jeden parametr formalny nazwany T. Słowo kluczowe typename/class oznacza, że parametr ten jest typem (nazwą typu) lub klasy. Nazwa tego parametru może być następnie wykorzystywana w definicji funkcji w miejscach, gdzie spodziewamy się nazwy typu/klasy. I tak powyższe wyrażenie (Listing 1) definiuje funkcję, która przyjmuje dwa argumenty typu T i zwraca wartość typu T, będącą wartością większego z dwu argumentów. Typ T jest na razie niewyspecyfikowany. W tym sensie szablon definiuje całą rodzinę funkcji. Konkretną funkcję z tej rodziny wybieramy poprzez podstawienie za formalny parametr T konkretnego typu będącego argumentem szablonu. Takie podstawienie nazywamy konkretyzacją szablonu. Argument szablonu umieszczamy w nawiasach <> za nazwą szablonu. Szablony klas Na podobnej zasadzie co szablony funkcji można także definiować szablony klas (inne określenia: wzorce klas, klasy ogólne). Szablony klas podobne są do makr, tyle że wykonywane są przez kompilator, a nie przez preprocesor. Cechują je pewne własności, których jednak nie ma preprocesor, np. można tworzyć rekurencyjne wywołania. Podobnie jak w przypadku szablonów funkcji, szablon klasy definiuje nam w rzeczywistości całą rodzinę klas.

Definicja szablonu klasy wygląda następująco: template <class T> class MojaKlasa { //definicja klasy Definicja umieszczona bezpośrednio przed definicją klasy informuje że klasa będzie korzystała z fikcyjnego typu o nazwie T. Definicja dotyczy tylko pojedynczej klasy zdefiniowanej bezpośrednio po frazie template. Przykłady implementacji i użycia klas z użyciem szablonów: // Listing 4 template <class T> class c_klasa { public: T zmienna; c_klasa(t l) { zmienna = l; void wyswietl() { cout << zmienna << endl; int main() { c_klasa<int> calkowita(2); calkowita.wyswietl(); c_klasa<char> znak('b'); znak.wyswietl(); // Listing 5 template <class T> class c_klasa { public: T zmienna; c_klasa(t l); void wyswietl(); template <class T> c_klasa<t>::c_klasa(t l) : zmienna(l) { template <class T> void c_klasa<t>::wyswietl() { cout << zmienna << endl;

int main() { c_klasa<int> calkowita(2); calkowita.wyswietl(); c_klasa<char> znak('b'); znak.wyswietl(); Zadania do wykonania 1. Napisać program, w którym zostaną zaimplementowane 3 funkcje sortujące (algorytmem bąbelkowym, przez wstawianie oraz quicksort) z wykorzystaniem szablonów funkcji. Należy zaprezentować ich zastosowanie dla różnych rodzajów danych wejściowych. Funkcje powinny przyjmować jako parametr tablice do posortowania oraz liczbę elementów w tablicy. 2. Napisać program, w którym zostanie zaimplementowana klasa operująca na stosie z wykorzystaniem szablonów klas. Należy zaprezentować działanie tak stworzonego stosu dla różnych rodzajów danych wejściowych. 3. Napisać program, w którym zostanie zaimplementowana klasa operująca na liście z wykorzystaniem szablonów klas. Należy zaprezentować działanie tak stworzonej listy dla różnych rodzajów danych wejściowych. 4. Napisać program, który będzie modyfikacją zadania nr 3 (laboratorium nr 2) implementującego słownik angielsko-polski przy pomocy kontenera map. Należy tak zmodyfikować program aby używane były w nim szablony funkcji/klas. Należy zaprezentować działanie tak stworzonego słownika dla różnych rodzajów danych wejściowych.