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

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

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

500.AJ Megoldó Magyar Magdolna 500.J

1.AA MEGOLDÓ BERCI AA 1.

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?

C++ Standard Template Library

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.

Collections. Összetett adatstruktúrák

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

128. AA Megoldó Alfréd AA 128.

500.AA Megoldó Kulcsár 500.A

500. CC Megoldó Alfréd CC 500.

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

Challenge Accepted:C++ Standard Template Library

503.AA Megoldo Arisztid 503.A

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

228. AA Default Konstruktor AA 228.

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

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

.AA Megoldó Alfréd AA.

C++ Gyakorlat jegyzet 10. óra.

500. DD Megoldó Alfréd DD 500.

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

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

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

Pénzügyi algoritmusok

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

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

3. Osztályok II. Programozás II

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 II. (7. ea) C++

feladat pont min elért

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

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

AA MEGOLDÓ ALADÁR AA

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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 II. ATM példa Dr. Iványi Péter

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

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

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

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

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.

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

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

Generikus Típusok, Kollekciók

Java és web programozás

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

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

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ás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Osztály és objektum fogalma

Pénzügyi algoritmusok

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ási technológia

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

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

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

Bevezetés a programozásba I.

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

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

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

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

Objektumok inicializálása

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

C++ Gyakorlat jegyzet 10. óra

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

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

Java és web programozás

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

Átírás:

Előző óra összefoglalása Programozás alapjai II. (11. ea) C++ STL algoritmusok Szeberényi Imre, Somogyi Péter BME IIT <szebi@iit.bme.hu> 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) M Ű E G Y E T E M 1 7 8 2 2018.04.24. - 1-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. // Ú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(); 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. 2018.04.24. - 3-2018.04.24. - 4 - STL tárolók összefoglalása /2 Tárolók fontosabb műveletei 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> 2018.04.24. - 5-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 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) 2018.04.24. - 7-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); 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. 2018.04.24. - 9-2018.04.24. - 10 - Delegálással (tartalmazással) #1 template <typename T, size_t maxsiz = 6> class Array { std::vector<t> vec; 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); 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(); ; const T& at(size_t i) const { return vec.at(i); 2018.04.24. - 11-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); 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/ 2018.04.24. - 13-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 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) 2018.04.24. - 15-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! 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; 2018.04.24. - 17-2018.04.24. - 18 -

3. Példa: mismatch Sorozat módosító műv. 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); 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() 2018.04.24. - 19-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() Kupac, min, max, permut. make_heap() push_heap() pop_heap() sort_heap() min(), max() min_element(), max_element() lexicographical_compare() next_permutation() prev_permutation() 2018.04.24. - 21-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 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 2018.04.24. - 24 -

Predikátumok és aritm. műv. Lekötők, átalakítók equal_to, not_equal_to, greater, less, greater_equal, less_equal logical_and, logical_or logical_not plus minus multiplies divides modulus negate 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 2018.04.24. - 25-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ő C++17-től megszűnik helyette bind és lambda hasonlító függvény 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, Print template sort_heap(iv.begin(), iv.end()); print(iv); // 10, 15, 20, 35, 92, vector<int>::iterator it = remove_if(iv.begin(), iv.end(), odd); iv.erase(it, iv.end()); print(iv); // 10, 20, 92, 2018.04.24. - 27-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())); 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; 2018.04.24. - 29-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); 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/ 2018.04.24. - 31-2018.04.24. - 32 - Működés leírása A statikus modell önmagában nem elegendő Ocean cellak[n][m] Viz lep Hal Obj nev, meret, iter, ittaveg kor lep lep Capa kor nemevett lep 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; 2018.04.24. - 33-2018.04.24. - 34 - Szekvenciadiagram Hal::lep() Koord pos(i,j); cellak[i][j]->lep(pos, *this, iter); if (cellak[i][j]->is_vege()) replobj(pos, new Viz); Idő sdlépés_ocean Client lep() opt atlanti: Ocean <<create>> lep(pos, atlanti, iter) is_vege() vege [ vege] <<create>> replobj(pos, viz) <<destroy>> pos : Koord cella : Hal Objektumok közötti üzenetváltások időbeli lefolyását szemlélteti. viz: Viz üzenet válasz feltétel megszűnik /// 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); 2018.04.24. - 35-2018.04.24. - 36 -

lépés_hal Hal::lep() szekvenciadiagramja Cápali és Cápeti Idő sd atlanti : Ocean pos : Koord cella : Hal viz: Viz lep(pos, atlanti, iter) opt [ iter < it ] ervenyes(ujpos) ujpos= keres() erv opt [ erv ] <<destroy>> replaceobj(ujpos, cella) alt [ kor> halszapkor] setobj(hal) <<create>> hal: Hal <<create>> viz2 : Viz 10 : setobj(viz2) 2018.04.24. - 37-2018.04.24. 2011.04.26. - 38 - Feladat Observer terv. minta 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? ConcreteObs1 +update( ) Observer -subjptr +update( ) ConcreteObs2 +update( ) Subject -obsptr[] +attach() +detach() +notify() ConcreteSubj 2018.04.24. - 39-2018.04.24. - 40 - Subject osztály class Subject { set<observer*> obs; // observerek pointere void attach(observer* os); void detach(observer* os); void notify(int reason); virtual ~Subject(); ; Observer osztály class Observer { Subject *subj; // megfigyelt objektum Observer(Subject* subj); virtual void update(subject* subj, int reason); virtual ~Observer(); ; 2018.04.24. - 41-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 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); 2018.04.24. - 43-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); Figyelt cápa class FigyeltCapa :public Capa, public Subject { Koord lastpos; Koord getpos() const { return lastpos; void lep(koord pos, Ocean& oc, int it); ; 2018.04.24. - 45-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 {... 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); ; 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); 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; 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/ 2018.04.24. - 49-2018.04.24. - 50 -