Programozás alapjai II. (6. ea) C++

Hasonló dokumentumok
Programozás alapjai II. (7. ea) C++

Programozás alapjai II. (7. ea) C++

Programozás alapjai II. (7. ea) C++

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás alapjai II. (8. ea) C++ bejárók és egy tervezési példa

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

117. AA Megoldó Alfréd AA 117.

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Programozás alapjai 2. (2. ea) C++

Programozás alapjai II. (2. ea) C++

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

128. AA Megoldó Alfréd AA 128.

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

500. AA Megoldó Alfréd AA 500.

.AA Megoldó Alfréd AA.

Programozás II. 4. Dr. Iványi Péter

Alprogramok, paraméterátadás

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

1.AA MEGOLDÓ BERCI AA 1.

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

500. CC Megoldó Alfréd CC 500.

Osztály és objektum fogalma

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Programozás alapjai II. (3. ea) C++

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

503.AA Megoldo Arisztid 503.A

3. Osztályok II. Programozás II

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Java és web programozás

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

1000.AA Megoldo Alfréd 1000.A

1. Alapok. Programozás II

feladat pont min elért

500.AJ Megoldó Magyar Magdolna 500.J

C++ programozási nyelv Konstruktorok-destruktorok

228. AA Default Konstruktor AA 228.

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Bevezetés a programozásba Előadás: A const

Pénzügyi algoritmusok

Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény

Objektumok inicializálása

feladat pont min elért

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Java és web programozás

Programozási Nyelvek: C++

C++ Gyakorlat jegyzet 8. óra

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Pénzügyi algoritmusok

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény

Programozás módszertan

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

és az instanceof operátor

500. DD Megoldó Alfréd DD 500.

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás alapjai II. (1. ea) C++

Programozás II. 2. Dr. Iványi Péter

Osztályok. 4. gyakorlat

C++ Standard Template Library (STL)

500.AA Megoldo Arisztid 500.A

Felhasználó által definiált adattípus

Bevezetés a C++ programozási nyelvbe

Fejlett programozási nyelvek C++ Iterátorok

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Bevezetés a programozásba 2

500.AA Megoldó Kulcsár 500.A

Programozás 5. Dr. Iványi Péter

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Programozás alapjai II. (6. ea) C++

Programozás alapjai II. (3. ea) C++

AA MEGOLDÓ ALADÁR AA

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Programozás alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

Programozás II gyakorlat. 6. Polimorfizmus

C++ programozási nyelv Struktúrák a C++ nyelvben

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás alapjai II. (5. ea) C++

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Mit ír ki? feladatok megoldásokkal

111. AA Megoldó Alfréd AA 111.

Átírás:

Programozás alapjai II. (6. ea) C++ generikus szerkezetek, template Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 1 -

Hol tartunk? C C++ javítások OBJEKTUM: konkrét adat és a rajta végezhető műveletek összessége OO paradigmák egységbezárás (encapsulation), többarcúság (polymorphism), példányosítás (instantiation), öröklés (inheritance), generikus szerkezetek OO dekompozíció, tervezés A C++ csupán eszköz Elveket próbálunk elsajátítani Újrafelhasználhatóság C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 2 -

Hol tartunk? /2 objektum megvalósítása osztály (egységbe zár, és elszigetel), konstruktor, destruktor, tagfüggvények inicializáló lista (tartalmazott obj. inicializálása) operátor átdefiniálás (függvény átdefiniálás) barát és konstans tagfüggvények dinamikus adat külön kezelést igényel öröklés és annak megvalósítása védelem enyhítése virtuális függvények és osztályok absztrakt osztályok C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 3 -

Mi az objektummodell haszna? A valóságos viselkedést írjuk le Könnyebb az analógia megteremtése Láttuk a példát (dig. áramkör modellezése) Digitális jel: üzenet objektum Áramköri elemek: objektumok Objektumok a valós jelterjedésnek megfelelően egymáshoz kapcsolódnak. (üzennek egymásnak) Könnyen módosítható, újrafelhasználható Funkcionális dekompozícióval is így lenne? C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 4 -

Ismétlés (alakzat) class Alakzat { protected: Pont p0; ///< alakzat origója Szin sz; ///< alakzat színe Inicializáló lista public: Alakzat(const Pont& p0, const Szin& sz) :p0(p0), sz(sz) {} const Pont& getp0() const { return p0; } virtual void rajzol() const = 0; void mozgat(const Pont& d); virtual ~Alakzat() {} }; Tartalmazott objektumok Virtuális destruktor C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 5 -

Ismétlés (alakzat) /2 class Poligon : public Alakzat { Pont *pontok; unsigned int np; Poligon(const Poligon&); Poligon& operator=(const Poligon&); public: Poligon(const Pont& p0, const Szin sz) :Alakzat(p0, sz), np(1) { pontok = new Pont[np-1]; } int getnp() const { return np; } Pont getcsp(unsigned int i) const; void add(const Pont& p); void rajzol(); ~Poligon() { delete[] pontok; } }; Inicializáló lista Dinamikus területet C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 6 -

Ismétlés (alakzat) /3 Pont Poligon::getcsp(unsigned int i) const { if (i >= np) throw "Poligon: nincs ilyen"; if (i == 0) return p0; return pontok[i-1] + p0; } void Poligon::add(const Pont& p) { Pont *tp = new Pont[np]; for (unsigned int i = 0; i < np-1; i++) tp[i] = pontok[i]; delete[] pontok; pontok = tp; pontok[np-1] = p - p0; ++np; } C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 7 -

Lehet-e tovább általánosítani? Általánosíthatók-e az adatszerkezetek? Már a komplexes első példán is észrevettük, hogy bizonyos adatszerkezetek (pl. tárolók) viselkedése független a tárolt adattól. Lehet pl. adatfüggetlen tömböt vagy listát csinálni? Általánosíthatók-e az algoritmusok? Lehet pl. adatfüggetlen rendezést csinálni? C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 8 -

elemzés: Din. tömb Tároljunk T-ket egy tömbben! Műveletek: Létrehozás/megszüntetés Indexelés Méretet a létrehozáskor (példányosításkor) adjuk Egyszerűség kedvéért nem másolható, nem értékadható és nem ellenőriz indexhatárt! C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 9 -

TArray megvalósítás class TArray { T *tp; // elemek tömbjére mutató pointer unsigned int n; // tömb mérete TArray(const TArray&); // másoló konstr. tiltása TArray& operator=(const TArray&); // tiltás public: TArray(int n=5) :n(n) { tp = new T[n]; } T& operator[](unsigned int); privát, így nem érhető el const T& operator[](unsigned int) const; // most nem impl. ~TArray() { delete[] tp; } }; T& TArray::operator[](unsigned int i) { return tp[i]; } C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 10 -

Mit kell változtatni? Minden T-t át kell írni a kívánt (pl, int, double, Komplex stb.) típusra. Neveket le kell cserélni (névelem csere) Más különbség láthatóan nincs. (Meg kellene valósítani tisztességesen, hogy használható legyen, de most nem ez a lényeg) C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 11 -

Lehet-e általánosítani? Típusokat és neveket le kell cserélni --> Generikus adatszerkezetek: Olyan osztályok, melyekben az adattagok és a tagfüggvények típusa fordítási időben szabadon paraméterezhető. Megvalósítás: preprocesszorral define + névkonkatenáció ## nyelvi elemként (template) C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 12 -

Preprocesszoral Típus és névelem csere makrókkal: Névelem csere: #define Array(T) T##Array Osztály deklarációk: #declare_array(t) makro Külső tagfüggvény definíciók: #implement_array(t) makro konkatenáció C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 13 -

Hogyan működik? névelem csere class TArray { T *tp; unsigned int n; public: TArray(int n=5) :n(n) { tp = new T[n]; }... #define Array(T) T##Array #define declare_array(t) \ class Array(T) { \ T *tp; \ unsigned int n; \ public: \ Array(T)(int n=5) \ :n(n) { tp = new T[n]; } \... declare_array(int) class intarray { int *tp; unsigned int n; public: intarray(int n=5) :n(n) { tp = new int[n]; }... C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 14 -

Array(T) #define Array(T) T##Array #define declare_array(t) \ class Array(T) { \ T *tp; \ unsigned int n; \ Array(T)(const Array(T)&); \ Array(T)& operator=(const Array(T)&); \ public: \ Array(T)(int n=5) :n(n) { tp = new T[n]; } \ T& operator[](unsigned int); \ ~Array(T)() { delete[] tp; } \ }; #define implement_array(t) \ T& Array(T)::operator[](unisgned int i) { return tp[i]; } C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 15 -

Használata #include "gen_array_m.hpp" //declare+implement makró class Valami {... }; // valamilyen osztály declare_array(int) // intarray deklarációja implement_array(int) // intarray def. csak 1-szer! declare_array(valami) // ValamiArray deklarációja implement_array(valami) // ValamiArray def. 1-szer! Array(int) a1, a2, a3; Array(Valami) v1, v2, v3; a2[0] = 5; v2[1] = Valami; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 16 -

Minden rendben? Tároljunk stringekre mutató pointereket: declare_array(char *) implement_array(char *) Mi lesz a makrókból? pl: #define Array(T) T##Array typedef-fel talán megoldható lenne Más, ennél a példánál nem jelentkező problémák is adódnak az egyszerű szöveghelyettesítésből, ezért jobb lenne nyelvi elemmel. Megoldás: template C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 17 -

Megoldás: template nyelvi elem formális sablonparaméter: tetszőleges típus template <class T> // Sablon kezdete class Array { // Array osztály dekl. kezd. T *tp; unsigned int n; public: Array(int n=5) :n(n) { tp = new T[n]; }... }; hatókör: a template kulcsszót követő deklaráció/definició vége Array<int> a1, a2, a3; Array<Valami> v1, v2, v3; aktuális sablonparaméter C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 18 -

Array osztály sablonja template <class T> // osztálysablon class Array { T *tp; // elemek tömbjére mutató pointer unsigned int n; // tömb mérete Array(const Array&); // másoló konstr. tiltása Array& operator=(const Array&); // tiltás public: Array(int n=5) :n(n) { tp = new T[n]; } T& operator[](unsigned int); const T& operator[](unsigned int) const; ~Array() { delete[] tp; } }; Névelem csere és a paraméterhelyettesítés nyelvi szinten történik. C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 19 -

Tagfüggvények sablonja template <class T> // tagfüggvénysablon T& Array<T>::operator[](unsigned int i) { } return tp[i]; template <class T> // tagfüggvénysablon const T& Array<T>::operator[](unsigned int i) const { return tp[i]; } sablonparaméter: tetszőleges típus scope miatt fontos hatókör: a template kulcsszót követő deklaráció/definició vége C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 20 -

Sablonok használata (példányosítás) #include "generic_array.hpp" // sablonok int main() { } sablon példányosítása aktuális template paraméterrel Array<int> ia(50), ia1(10); // int array Array<double> da; // double array Array<const char*> ca; // const char* array ia[12] = 4; da[2] = 4.54; ca[2] = "Hello Template"; return 0; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 21 -

Array osztály másként template <class T, unsigned int s> // osztálysablon class Array { T t[s]; // elemek tömbje public: T& operator[](unsigned int i) { if (i >= s) throw "Indexelési hiba"; return t[i]; } const T& operator[](unsigned int i) const; }; Többször példányosodik! Növeli a kódot, ugyanakkor egyszerűsödött az osztály. Konst. obj-hoz Array<int, 10> a10; Array<int, 30> a30; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 22 -

deafault paraméter is lehet template <class T, unsigned int s = 10> // osztálysablon class Array { T t[s]; // elemek tömbje public: T& operator[](unsigned int i) { if (i >= s) throw "Indexelési hiba"; return t[i]; } const T& operator[](unsigned int i) const; }; Array<int> a10; Array<int, 30> a30; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 23 -

Lehet-e tovább általánosítani? Általánosíthatók-e az adatszerkezetek? Sablon Általánosíthatók-e a függvények? Sablon template <typename T> inline T Max(T a, T b) { return a > b? a : b; } std::cout << Max<int>(6, 8); std::cout << Max (3.7, 8.9); A sablonparaméterek többnyire levezethetők a függvényparaméterekből. C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 24 -

Függvénysablon Függvények, algoritmusok általánosítási eszköze. Hatékony, paraméterezhető, újrafelhasználható, általános. template <class T> void rendez (T a[], int n) { for (int i = 1; i < n; i++) { T tmp = a[i]; int j = i-1; while (j >= 0 && a[j] > tmp) { a[j+1] = a[j]; j--; } a[j+1] = tmp; } }... int t[] = { 4, 8, -2, 88, 33, 1, 4, -1 }; rendez<int>(t, 8); C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 25 -

Kérdések 1. Referecia paraméterrel hatékonyabb-e? template <typename T> const T& Max(const T& a, const T& b) { return a > b? a : b; } 2. Működik-e sztringel? std::cout << Max("Hello", "Adam"); Címeket hasonlítunk össze sztringek helyett! C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 26 -

Megoldás: specializáció template <typename T> const T& Max(const T& a, const T& b) { return a > b? a : b; } // Specilaizáció T::= const char* esetre template <> const char* Max(const char* a,const char* b){ return strcmp(a,b) > 0? a : b; } std::cout << Max("Hello", "Adam"); C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 27 -

Specializáció Függvények különböző változatai: átdefiniálás Sablonok esetében egy újabb eszközünk is van: specializáció. Egy sablonnal megadott osztály, vagy függvény adott változatát átdefiniálhatjuk. Ilyenkor nem a sablonban megadott módon fog példányosodni. template <class T> struct V { T a1; V() :a1(t()) { } }; template <> struct V<double> { double a1; V() :a1(3.14) { } }; V<int>v1; V<double>v2; a1 = 0; a1 = 3.14; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 28 -

Mi is a sablon? Nyelvi elem az általánosításhoz. Gyártási forma. A sablonparaméterektől függően példányosodik: osztály vagy függvény jön belőle létre. Paraméter: típus, konstans, függvény, sablon Default paramétere is lehet. A példányok specializálhatók, melyek eltérhetnek az eredeti sablontól. A példányosítás helyének és a sablonnak egy fordítási egységben kell lennie (.hpp). C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 29 -

A feldolgozás fordítási idejű template <int N> struct fakt { enum { fval = N * fakt<n-1>::fval }; }; Specializálás template <> struct fakt<0> { enum { fval = 1 }; }; std::cout << fakt<3>::fval << std::endl; Fordítási időben 4 példány (3,2,1,0) keletkezik Nem akarunk így programozni! Csak szemléltetés. C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 30 -

Template paraméter típus, konstans, függvény, sablon template <class T1, typename T2, int i = 0> struct V { T1 a1; T2 a2; int x; V() { x = i;} }; V<int, char, 4> v1; V<double, int> v2; default template <class T> struct miez { T a0; }; template <class K, template <class T> class C = miez> struct S { C<K> a1; }; S<int> vau; vau.a1.a0 = 10; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 31 -

Részleges és teljes specializáció template <class R, class S, class T> struct A { }; template <class S, class T> struct A<char, S, T> { }; részleges specializálás teljes specializálás template <> struct A<char, char, char>{ }; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 32 -

Függvénysablonok paraméterei A sablonparaméterek általában levezethetők a függvényparaméterekből. Pl: template<class T> void csere(t& p1, T& p2) { T tmp = p1; p1 = p2; p2 = tmp; } int x1 = 1, x2 = 2; csere(x1, x2); Ha nem, akkor meg kell adni. Pl: template<class T, int n> void fv(t t1[n], T t2[n]) { for (int i = n; i >= 0; i--) t1[i] = t2[i]; } int it1[10], it2[10]; fv<int, 10>(it1, it2); C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 33 -

Algoritmus módosítása Előfordulhat, hogy egy algoritmus (pl. rendezés) működösét módosítani akarjuk egy függvénnyel (predikátum). Sablonparaméterként egy eljárásmódot (függvényt) is átadhatunk, ami lehet osztályban, vagy önállóan. Példa: Írjunk egy általános kiválasztó algoritmust, ami képes kiválasztani a legkisebb, legnagyobb, leg... elemet. C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 34 -

Kiválasztó algoritmus sablonnal template<class T, int n, class S> T kival(t t[n]) { T tmp = t[0]; for (int i = 1; i < n; i++) if (S::select(t[i], tmp)) tmp = t[i]; return tmp; } Feltételezzük, hogy van egy osztályunk, aminek van egy alkalmas select tagfüggvénye C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 35 -

select fv. is lehet sablon template<class T> struct kisebb { // szokásos kisebb a min. kereséshez static bool select(t a, T b) { return a < b; } }; template<class T> struct nagyobb { // szokásos nagyobb. keresésez static bool select(t a, T b) { return a > b; } }; struct intkisebbabs { // szokásostól eltérő kiválasztó static bool select(int a, int b) { return abs(a) < abs(b);} }; C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 36 -

Kiválasztó algoritmus használata int main() { } szóköz kell, különben >>-nek értené! int it[9] = {-5, -4, -3, -2, -1, 0, 1, 2, 3 }; double dt[5] = {.0,.1,.2,.3, 4.4 }; cout << kival<double, 5, nagyobb<double> >(dt);// max cout << kival<int, 9, kisebb<int> >(it); // mimimum cout << kival<int, 9, intkisebbabs>(it); // eltérő kiv. fv. return(0); A select statikus tagfüggvény, ezért nem kell külön példányosítani. C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 37 -

Tagfüggvény vagy önálló fv. Előzőekben osztálysablonba építettük a predikátum függvényt. Önálló függvény is lehet predikátum: template<class T, int n, bool select(t, T)> T kivalfv(t t[n]) { T tmp = t[0]; for (int i = 1; i < n; i++) if (select(t[i], tmp)) tmp = t[i]; return tmp; } template<class T> bool kisebbfv (T a, T b) { return a < b; } cout << kivalfv<int, 9, kisebbfv>(it); C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 38 -

Függvényparaméter és fv. objektum Leggyakrabban egy osztály függvényhívó operátorát használjuk (ún. függvény obj). Ez azonban nem lehet static: template<class T, class F> T kivalaszt(t t[], int n, F Func) { T tmp = t[0]; for (int i = 1; i < n; i++) if (Func(t[i], tmp)) tmp = t[i]; return tmp; létre kell hozni } template<class T> struct kisebbobj { bool operator()(t& a, T& b) { return a < b; } }; cout << kivalaszt<int, kisebbobj<int> >(it, 9, kisebbobj<int>() ); C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 39 -

Függvény objektum: funktor template<class T> struct HasonlitObj { bool operator()(t a, T b) { return a > b; } }; Objektum fv. operátora. Példány kell. int t[6] = {1, 2, -8, 0, 12, 3}; kivalaszt(t, 6, hasonlitobj<int>()); C++ programozási nyelv BME-IIT Sz.I. BME-IIT Sz.I. 2015.03.31. - 40 -

Predikátum Logikai függvények, vagy függvényobjektumok, amelyek befolyásolják az algoritmus működését Predikátum megadása Sablonparaméterként: template<class T, int n, bool select(t, T)> T keresf(t t[n]); Függvényparaméterként: template<class T, class F> T ker(t t[], int n, F Func); Gyakoribb, rugalmasabb megadási mód C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 41 -

Összefoglalás A C-ben megtanult preprocesszor trükkökkel általánosíthatók az osztályok Nem biztonságos, és nem ad mindenre megolást. Nyelvi elem bevezetése: template A preprocesszoros trükköt csak a működés jobb megértéséhez néztük meg, ma már nem illik használni. C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 42 -

Összefoglalás /2 Generikus osztályokkal tovább általánosíthatjuk az adatszerkezetekről alkotott képet: Típust paraméterként adhatunk meg. A generikus osztály később a típusnak megfelelően példányosítható. A specializáció során a sablontól eltérő példány hozható létre Specializáció lehet részleges, vagy teljes C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 43 -

Összefoglalás /3 Generikus függvényekkel tovább általánosíthatjuk az algoritmusokról alkotott képet: Típust paraméterként adhatunk meg. A generikus függvény később a típusnak megfelelően példányosítható. A függvényparaméterekből a konkrét sablonpéldány levezethető, ha nem, akkor explicit módon kell megadni Függvénysablon átdefiniálható C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 44 -

Összefoglalás /4 Predikátumok segítségével megváltoztatható egy algoritmus működése Ez lehetővé teszi olyan generikus algoritmusok írását, mely specializációval testre szabható. Ügyetlen template használat feleslegesen megnövelheti a kódot (pl. széles skálán változó paramétert is template paraméterként adunk át.) C++ programozási nyelv BME-IIT Sz.I. 2016.03.29. - 45 -