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

Hasonló dokumentumok
Előző óra összefoglalása. Programozás alapjai II. (11. ea) C++ STL algoritmusok. Létrehozás/megsemm. példa. STL tárolók összefoglalása

Programozás alapjai II. (11. ea) C++ STL algoritmusok

C++11 TÓTH BERTALAN C++ PROGRAMOZÁS STL KONTÉNEREKKEL

Fejlett programozási nyelvek C++ Iterátorok

Bevezetés a programozásba 2

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

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

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

C++ Standard Template Library (STL)

Programozás alapjai II. (13. ea) C++ Év végi összefoglalás

Programozás alapjai II. (13. ea) C++ Év végi összefoglalás

XIII. STL. Tároló Bejáró Algoritmus. XIII.1 A vector #include <vector> #include <vector> #include <algorithm> using namespace std;

117. AA Megoldó Alfréd AA 117.

500.AA Megoldo Arisztid 500.A

500. AA Megoldó Alfréd AA 500.

1000.AA Megoldo Alfréd 1000.A

1.AA MEGOLDÓ BERCI AA 1.

500.AJ Megoldó Magyar Magdolna 500.J

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

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.

C++ Standard Template Library

Collections. Összetett adatstruktúrák

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

128. AA Megoldó Alfréd AA 128.

A C++ Standard Template Library rövid összefoglalás

500. CC Megoldó Alfréd CC 500.

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

500.AA Megoldó Kulcsár 500.A

Challenge Accepted:C++ Standard Template Library

503.AA Megoldo Arisztid 503.A

228. AA Default Konstruktor AA 228.

Standard Template Library. Adatstruktúrák és algoritmusok a C++ nyelvhez

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

.AA Megoldó Alfréd AA.

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

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

C++ Gyakorlat jegyzet 10. óra.

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

500. DD Megoldó Alfréd DD 500.

Programozás II gyakorlat. 8. Operátor túlterhelés

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Pénzügyi algoritmusok

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

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

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

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

3. Osztályok II. Programozás II

feladat pont min elért

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

feladat pont min elért

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

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

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

AA MEGOLDÓ ALADÁR AA

Programozás II. ATM példa Dr. Iványi Péter

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

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

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Programozás C++ -ban

Programozás. C++ típusok, operátorok. Fodor Attila

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozás C++ -ban 2007/4

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

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

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

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

111. AA Megoldó Alfréd AA 111.

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

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

S02-3 Multiparadigma programozás és Haladó Java 2

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

Generikus Típusok, Kollekciók

Java és web programozás

Programozási tételek újrafelhasználása

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Pénzügyi algoritmusok

Osztály és objektum fogalma

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) {} };

Programozási technológia

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

ISA szimulátor objektum-orientált modell (C++)

Bevezetés a programozásba I.

Elemi alkalmazások fejlesztése II. 2. Beadandó feladat Juhász Ádám

1. Alapok. Programozás II

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozás C++ -ban

Objektumok inicializálása

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

C# osztályok. Krizsán Zoltán

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

Programozás II. 6.Öröklés Dr. Iványi Péter

Java és web programozás

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Átírás:

Programozás alapjai II. (11. ea) C++ STL algoritmusok Szeberényi Imre, Somogyi Péter 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. 2018.04.24. - 1 -

Előző óra összefoglalása Kivételkezelés működés részletei, hatása az objektumok élettartamára Konstruktorban, destruktorban Létrehozás/megsemmisítés működésének felhasználása (pl. fájlkezelés, zárolás) STL bevezető (tárolók) C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 2 -

Létrehozás/megsemm. példa // Halak és cápák példában tudni szeretnénk a halak számát: class Halor { static int darab; // darabszám nyilvántartása. public: // Új példány jön létre, növel Halor() { darab++; // Darabszám lekérdezése static int getdarab() { return darab; // Példány megszűnik virtual ~Halor() { darab--; ; int Halor::darab = 0; class Hal : public Obj, Halor {... ;... std::cout << Halor::getDarab(); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 3 -

STL tárolók összefoglalása A tárolók nem csak tárolják, hanem "birtokolják is az elemeket" elemek létrehozása/megszüntetése/másolása Két fajta STL tároló van: Sorozat tárolók (vector, list, deque) A programozó határozza meg a sorrendet: Asszociatív tárolók (set, multiset, map, multimap) A tároló határozza meg a tárolt sorrendet Az elemek egy kulccsal érhetők el. C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 4 -

STL tárolók összefoglalása /2 vector<t, Alloc> list<t, Alloc> deque<t, Alloc> map<key, T, Cmp, Alloc> set<key, Cmp, Alloc> stack<t, deque> queue<t, deque> priority_queue<t, vector, Cmp> C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 5 -

Tárolók fontosabb műveletei C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 6 -

Ma Adapter tervezési minta (ism.) STL algoritmusok Korábbi példa továbbfejlesztése STL tároló használata STL iterátor használata Egy tipikus viselkedési minta és megvalósítása Observer C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 7 -

std::vektor labor::array labor::array (9. labor, /gen_array_iter3/): fix méretű (maxsize) van aktuális mérete (siz) van at(), de nyújtja a tömböt (maxsize-ig) nincs operator[] van iterátora (iterator) konstruktorai a konténereknél megszokottak van operator= std::vector: minden van, de nem nyújtja a tömböt az at(), de dinamikusan képes növekedni (push_back) C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 8 -

Egy lehetséges megvalósítás #1 template <typename T, size_t maxsiz = 6> struct Array : public std::vector<t> { Array(size_t n = 0, const T& value = T()) :std::vector<t>::vector(n, value) { template <class Iter> Array(Iter first, Iter last) :std::vector<t>::vector(first, last) { T& at(size_t i) { if (i < maxsiz && i >= std::vector<t>::size()) std::vector<t>::resize(i+1); return std::vector<t>::at(i); const T& at(size_t i) const { return std::vector<t>::at(i); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 9 -

Egy lehetséges megvalósítás #2 private: T& operator[](size_t i); const T& operator[](size_t i) const {... ; std::vector minden tagfüggvénye az öröklés révén publikálva, a nem megfelelőeket módosított működéssel megvalósítottuk. Ha nem jó, lehet privát örökléssel is, ekkor minden fv-hez kell interfész. Szóba jöhet még a tartalmazás (delegálás) is. C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 10 -

Delegálással (tartalmazással) #1 template <typename T, size_t maxsiz = 6> class Array { std::vector<t> vec; public: Array(size_t n = 0, const T& value = T()) : vec(n, value) { template <class Iter> Array(Iter first, Iter last) : vec(first, last) { T& at(size_t i) { if (i < maxsiz && i >= vec.size()) vec.resize(i+1); return vec.at(i); const T& at(size_t i) const { return vec.at(i); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 11 -

Delegálással (tartalmazással) #2 size_t size() const { return vec.size() ; size_t capacity() const { return vec.capacity() ;... typedef typename std::vector<t>::iterator itarator; iterator begin(); iterator end(); ; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 12 -

Apróbb működési különbségek #1 template <typename T, size_t maxsiz = 6> struct Array : public std::vector<t> { Array(size_t n = 0, const T& value = T()) :std::vector<t>::vector(n, value) { // nagyobb lehet maxsiz-nél // nincs maxsiz-ig lefoglalva // modosítás: Array(size_t n = 0, const T& value = T()) :std::vector<t>::vector(std::min(n,maxsiz), value) { std::vector<t>::reserve(maxsiz); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 13 -

Apróbb működési különbségek #2 template <typename T, size_t maxsiz = 6> template <class Iter> Array(Iter first, Iter last) :std::vector<t>::vector(first, last) { // nagyobb lehet maxsiz-nél // nincs maxsiz-ig lefoglalva // modosítás: template <class Iter> Array(Iter first, Iter last) :std::vector<t>::vector(first, last) { if (std::vector<t>::size() > maxsiz) std::vector<t>::resize(maxsiz); else std::vector<t>::reserve(maxsiz); http://svn.iit.bme.hu/proga2/eloadas_peldak/ea_11/vector2gen_arary_adapter/ C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 14 -

Algoritmusok <algorithm> Nem módosító sorozatműveletek Sorozatmódosító műveletek Rendezés, rendezett sorozatok műveletei Halmazműveletek Kupacműveletek Mimimum, maximum Permutációk C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 15 -

Nem módosító műv. for_each(first, last, fn) find(first, last, val), find_if(first, last, un_pred) find_end(f1, l1, f2, l2, un_pred), find_first_of(f1, l1, f2, l2, un_pred), adjacent_find(first, last, bin_pred) count(first, last) count_if(first, last, un_pred) mismatch(f1, l1, f2, l2, bin_pred) // ret: pair equal(f1, l1, l2, bin_pred) search(f1, l1, f2, l2, bin_pred) search_n(f, l, count, val, bin_pred) C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 16 -

1. Példa: count_if template <class InpIterator, class UnPredicate > prtdiff_t count_if(inpiterator first, InpIterator last, UnPredicate pred ) { prtdiff_t ret = 0; while (first!= last) if (pred(*first++)) ++ret; return ret; int v[] = {11, 2, 3, 32, 21, 15 ; bool IsOdd(int i) { return ((i%2)==1); cout << count_if (v, v+6, IsOdd); // az int* is iterator! C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 17 -

2. Példa: adjacent_find template <class FwIterator, class BinPredicate > FwIterator adjacent_find(fwiterator first, FwIterator last, BinPredicate pred ) { if (first!= last) { FwIterator next=first; ++next; while (next!= last) if (pred(*first++, *next++)) return first; return last; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 18 -

3. Példa: mismatch template <class Iter1, class Iter2, class BinPred> pair<iter1, Iter2> mismatch(iter1 first1, Iter1 last1, Iter2 first2, BinPred pred) { while (first1!= last1) { if (!pred(*first1,*first2)) break; ++first1; ++first2; return make_pair(first1, first2); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 19 -

Sorozat módosító műv. copy() copy_backward() swap(), iter_swap() swap_ranges() replace() replace_if() replace_copy() replace_copy_if() fill(), fill_n() generate() generate_n() partition() stable_partition() remove() remove_if() remove_copy() remove_copy_if() unique() unique_copy_if() reverse() reverse_copy() rotate(), rotate_copy() random_shuffle() transform() C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 20 -

Rendezés, rend.sor. műv., halmaz sort(), stable_sort(), partial_sort() partial_sort_copy() nth_element() lower_bound(), upper_bound() equal_range() binary_search() merge() inplace_merge() includes() set_union(), set_intersection(), set_difference() set_symmetric_difference() C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 21 -

Kupac, min, max, permut. make_heap() push_heap() pop_heap() sort_heap() min(), max() min_element(), max_element() lexicographical_compare() next_permutation() prev_permutation() C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 22 -

4. példa int v[] = {10,20,30,30,20,10,10,20; int *ip = adjacent_find (v, v+8); // a pointer is iterator! vector<int> iv(v, v+8); vector<int>::iterator it; it = adjacent_find(iv.begin(), iv.end()); // első ismétlődés it = adjacent_find(++it, iv.end()); // második ism. it = adjacent_find(iv.begin(), iv.end(), greater<int>()); predikátum C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 23 -

Függvényobjektumok <functional> unary_function, binary_function template <class Arg, class Result> struct unary_function { typedef Arg argument_type; typedef Result result_type; ; struct Valami : public unary_function<int, bool> {... ;... Valami::argument_type... Valami::result_type...... C++17-től megszűnik helyette function template és lambda C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 24 -

Predikátumok és aritm. műv. equal_to, not_equal_to, greater, less, greater_equal, less_equal logical_and, logical_or logical_not plus minus multiplies divides modulus negate C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 25 -

Lekötők, átalakítók bind2nd() bind1st() mem_fun() mem_fun_ref() prt_fun() not1() not2() binder1st binder2nd mem_fun1_ref_t mem_fun1_t mem_fun_ref_t mem_fun_t unary_negate binary_negate C++17-től megszűnik helyette bind és lambda C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 26 -

5. példa int v[] = {10,20,30,30,20,10,10,20; predikátum cout << count_if(v, v+8, bind2nd(less<int>(), 11)); lekötő hasonlító függvény C++17-től megszűnik helyette bind és lambda C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 27 -

6. példa bool odd(int i) { return i&1;... int v[] = {10,20,15,35,92; vector<int> iv(v, v+5); make_heap(iv.begin(), iv.end()); print(iv); // 92, 35, 15, 10, 20, sort_heap(iv.begin(), iv.end()); print(iv); // 10, 15, 20, 35, 92, Print template vector<int>::iterator it = remove_if(iv.begin(), iv.end(), odd); iv.erase(it, iv.end()); print(iv); // 10, 20, 92, C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 28 -

7. példa int pow(int i) { return i*i;... int v[] = {1,2,5,7,10; vector<int> iv(v, v+5); transform(iv.begin(), iv.end(), iv.begin(), pow); print(iv); // 1, 4, 25, 49, 100, iv.pop_back(); iv.pop_back(); do { print(iv); 1, 4, 25, 1, 25, 4, 4, 1, 25, 4, 25, 1, 25, 1, 4, 25, 4, 1, while (next_permutation(iv.begin(), iv.end())); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 29 -

8. példa: Szavak gyakorisága // Szavakat olvasunk, de eldobjuk a számjegyeket bool isdigit(char ch) { return isdigit(ch)!= 0; map<string, int> szamlalo; string szo; while (cin >> szo) { string::iterator vege = remove_if(szo.begin(), szo.end(), isdigit); szo.erase(vege, szo.end()); if (!szo.empty()) szamlalo[szo] += 1; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 30 -

Szavak gyakorisága /2 // Kiírjuk a szavakat és az előfordulási számot. // Betesszük egy vektorba a szavakat. // A map miatt rendezett. vector<string> szavak; cout << "Szavak gyakorisaga:" << endl; for (map<string, int>::iterator it = szamlalo.begin(); it!= szamlalo.end(); it++) { cout << it->first << ": " << it->second << endl; szavak.push_back(it->first); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 31 -

Szavak gyakorisága /3 // Kiírjuk a szavakat a vektorból. // Fordítva is lerendezzük. cout << "Szavak rendezve:" << endl; ostream_iterator<string> out_it(cout, ","); copy(szavak.begin(), szavak.end(), out_it); cout << endl << "Szavak forditva:" << endl; sort(szavak.begin(), szavak.end(), greater<string>()); copy(szavak.begin(), szavak.end(), out_it); http://svn.iit.bme.hu/proga2/eloadas_peldak/ea_11/szostatisztika/ C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 32 -

Működés leírása A statikus modell önmagában nem elegendő Ocean cellak[n][m] lep Obj nev, meret, iter, ittaveg lep Viz Hal kor lep Capa kor nemevett lep C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 33 -

Ocean::lep() /// Egy iterációs lépés void Ocean::lep() { iter++; for (int i = 0; i < MaxN; i++) for (int j = 0; j < MaxM; j++) { Koord pos(i,j); cellak[i][j]->lep(pos, *this, iter); // hullák begyűjtése if (cellak[i][j]->is_vege()) replobj(pos, new Viz); // Objektum törlése és pointer átírása void Ocean::replObj(Koord& pos, Obj* o) { delete cellak[pos.i][pos.j]; cellak[pos.i][pos.j] = o; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 34 -

Szekvenciadiagram Koord pos(i,j); cellak[i][j]->lep(pos, *this, iter); if (cellak[i][j]->is_vege()) replobj(pos, new Viz); Objektumok közötti üzenetváltások időbeli lefolyását szemlélteti. Idő sd lépés_ocean Client lep() atlanti: Ocean <<create>> pos : Koord cella : Hal üzenet lep(pos, atlanti, iter) válasz is_vege() vege feltétel opt [ vege] <<create>> replobj(pos, viz) <<destroy>> viz: Viz megszűnik C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 35 -

Hal::lep() /// Hal viselkedése void Hal::lep(const Koord& pos, Ocean& oc, int it){ if (iter >= it) return; iter = it; kor++; Koord ujpos = keres(pos, oc); if (oc.ervenyes(ujpos)) { oc.replobj(ujpos, this); Obj* o; if (kor > halszapkor) o = new Hal(*this); else o = new Viz; oc.setobj(pos, o); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 36 -

Hal::lep() szekvenciadiagramja Idő sd lépés_hal atlanti : Ocean pos : Koord cella : Hal viz: Viz lep(pos, atlanti, iter) opt [ iter < it ] erv eny es(ujpos) ujpos= keres() erv opt [ erv ] <<destroy >> replaceobj(ujpos, cella) alt [ kor> halszapkor] setobj(hal) <<create>> hal: Hal <<create>> viz2 : Viz 10 : setobj(viz2) C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 37 -

Cápali és Cápeti C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. 2011.04.26. - 38 -

Feladat Egészítsük ki a korábbi modellünket: Az állatvédők tudni akarják, hogy mekkora utat tesz meg élete során Cápeti, a cápa. A tengerbiológusok tudni akarják, hogy hányszor szaporodik Cápeti. Dokumentum film készül Cápeti útjáról. Kérdések: Tegyünk 3 jeladót Cápeti nyakába? 1 jeladó jelezzen mindenkinek? C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 39 -

Observer terv. minta Observer -subjptr +update( ) Subject -obsptr[] +attach() +detach() +notify() ConcreteObs1 +update( ) ConcreteObs2 +update( ) ConcreteSubj C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 40 -

Subject osztály class Subject { set<observer*> obs; // observerek pointere public: void attach(observer* os); void detach(observer* os); void notify(int reason); virtual ~Subject(); ; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 41 -

Observer osztály class Observer { Subject *subj; // megfigyelt objektum public: Observer(Subject* subj); virtual void update(subject* subj, int reason); virtual ~Observer(); ; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 42 -

Subject tagfüggvényei /1 void Subject::attach(Observer *o) { obs.insert(o); void Subject::detach(Observer *o) { obs.erase(obs.find(o)); Subject::~Subject() { notify(0); // jelzi, hogy megszűnt C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 43 -

Subject tagfüggvényei /2 // minden figyelőt értesít a változásról void Subject::notify(int reason) { for (std::set<observer*>::iterator it = obs.begin(); it!= obs.end(); it++ ) (*it)->update(this, reason); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 44 -

Observer tagfüggvényei Observer::Observer(Subject *subj) :subj(subj){ subj->attach(this); void Observer::update(Subject* subj, int reason) { if (reason == 0) this->subj = 0; // megszűnt: nem figyeli Observer::~Observer() { if (subj!= 0) // van még kit figyelni? subj->detach(this); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 45 -

Figyelt cápa class FigyeltCapa :public Capa, public Subject { Koord lastpos; public: Koord getpos() const { return lastpos; void lep(koord pos, Ocean& oc, int it); ; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 46 -

Cápafigyelő //A példában minden ebben az osztályban, de // a célszerűen több figyelő kellene. class CapaFigyelo : public Observer {... public: CapaFigyelo(FigyeltCapa *fc); int getkor() const; // kor lekérdezése int getehes() const; // éhség lekérdezése int getszapor() const; // szaporulat lekérdezése void update(subject *subj, int oka); void ut(std::ostream& os); ; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 47 -

CapaFigyelo::update() void CapaFigyelo::update(Subject *subj, int oka) { if (oka!= 0) { // Tudjuk, hogy figyelt cápára mutató poi, ezért konvertálunk FigyeltCapa *fc = dynamic_cast<figyeltcapa*>(subj); // Biztonságból ellenőrizzük a down cast eredményét if (fc == 0) throw std::runtime_error("bad_cast: Figyelt"); kor = fc->getkor(); ehes = fc->getehes(); szapor = fc->getszapor(); utvonal.push_back(fc->getpos()); // Alaposztály update: megszünteti a regisztrációt, ha kell Observer::update(subj, oka); C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 48 -

Figyelés indítása FigyeltCapa *capeti = new FigyeltCapa; CapaFigyelo mester(capeti); CapaFigyelo filmes(capeti); CapaFigyelo biologus(capeti);. cout << "Capeti kora:" << mester.getkor() << endl; cout << "Capeti utodai:" << biologus.getszapor() << endl; cout << "Capeti utja:"; filmes.ut(cout); cout << endl; C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 49 -

Eredmény Capeti kora:52 Capeti utodai:46 Capeti utja: (2,5) (1,5) (0,5) (0,6) (0,6) (0,7) (0,7) (0,8) (0,8) (0,9) (0,9) (0,10) (0,10) (0,11) (0,11) (0,12) (0,12) (0,13) (0,13) (0,14) (0,14) (0,15) (0,15) (0,16) (0,16) (0,17) (0,17) (0,18) (0,18) (0,19) (0,19) (0,20) (0,20) (0,21) (0,21) (0,22) (0,22) (0,23) (0,23) (0,24) (0,24) (0,25) (0,25) (0,26) (0,26) (0,27) (0,27) (0,28) (0,28) (0,29) (0,29) (0,30) (0,30) (0,31) (0,31) (0,32) (0,32) (0,33) (0,33) (0,34) (0,34) (0,35) (0,35) (0,36) (0,36) (0,37) (0,37) (0,38) (0,38) (0,39) (0,39) (1,39) (1,39) (2,39) (2,39) (3,39) (3,39) (4,39) (4,39) (5,39) (5,39) (6,39) (6,39) (7,39) (7,39) (8,39) (8,39) (9,39) (9,39) (8,39) (8,38) (7,38) (6,38) (5,38) (5,38) (4,38) http://svn.iit.bme.hu/proga2/eloadas_peldak/ea_11/sharksandfishes2/ C++ programozási nyelv BME-IIT Sz.I. 2018.04.24. - 50 -