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

Hasonló dokumentumok
500.AJ Megoldó Magyar Magdolna 500.J

500.AA Megoldo Arisztid 500.A

1000.AA Megoldo Alfréd 1000.A

500. AA Megoldó Alfréd AA 500.

1.AA MEGOLDÓ BERCI AA 1.

128. AA Megoldó Alfréd AA 128.

500.AA Megoldó Kulcsár 500.A

503.AA Megoldo Arisztid 503.A

.AA Megoldó Alfréd AA.

500. DD Megoldó Alfréd DD 500.

500. CC Megoldó Alfréd CC 500.

228. AA Default Konstruktor AA 228.

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.

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

111. AA Megoldó Alfréd AA 111.

117. AA Megoldó Alfréd AA 117.

3. Osztályok II. Programozás II

feladat pont min elért

feladat pont min elért

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

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

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

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

C++ programozási nyelv Konstruktorok-destruktorok

- 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]++;

C++ Standard Template Library (STL)

Pénzügyi algoritmusok

Fejlett programozási nyelvek C++ Iterátorok

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

Mit ír ki? feladatok megoldásokkal

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

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

4. Öröklődés. Programozás II

Programozás II gyakorlat. 6. Polimorfizmus

AA MEGOLDÓ ALADÁR AA

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

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

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

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 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?

Bevezetés a programozásba I.

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

Pénzügyi algoritmusok

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

Bevezetés a programozásba 2

Programozási Nyelvek: C++

1. Alapok. Programozás II

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Objektumok inicializálása

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

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

C++ Gyakorlat jegyzet 10. óra.

Globális operátor overloading

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

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

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

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

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

Programozás C++ -ban

#include <iostream> using namespace std; // struct macska is lehetne class macska { public: int kor; int suly; }; void main() { macska cirmi;

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Kalapácsvetés 2016 szöveges

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

OOP #14 (referencia-elv)

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Programozás C++ -ban 2007/4

Pénzügyi algoritmusok

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

Programozás módszertan

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

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

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

Maximum kiválasztás tömbben

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

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

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

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 II. (8. ea) C++ bejárók és egy tervezési példa

Tárolók és metódusaik jellegű feladatok megoldásokkal

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.

Osztályok. 4. gyakorlat

Programozás II gyakorlat. 4. Öröklődés

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

Bevezetés, a C++ osztályok. Pere László

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

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

A C++ nyelvben a függvény nevek túlterhelésével biztonságosabbá tehetnénk az adatok kiírását és beolvasását.

1. Jelölje meg az összes igaz állítást a következők közül!

C++ Gyakorlat jegyzet 7. óra

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

10. gyakorlat Struktúrák, uniók, típusdefiníciók

C++ programozási nyelv

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

Java és web programozás

Átírás:

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

Komponensek kapcsolata Deklarálja az alábbi osztálydiagramon szereplő osztályok közül az A, AA és AB osztályokat! A konstruktorokat valósítsa is meg! A tagváltozók kezdeti értékét a konstruktorparaméterek adják. (3p) Izsó Tamás STL gyakorlat/ 2

KZH 4 struct A { v i r t u a l void f ( ) = 0; v i r t u a l ~A ( ) ; } ;

KZH 4 struct A { v i r t u a l void f ( ) = 0; v i r t u a l ~A ( ) ; } ; class AA : public A { double ar ; public : AA( double d ) : ar ( d ) { } void f ( ) ; } ;

KZH 4 struct A { v i r t u a l void f ( ) = 0; v i r t u a l ~A ( ) ; } ; class AA : public A { double ar ; public : AA( double d ) : ar ( d ) { } void f ( ) ; } ; class AB : public A, public B { s t r i n g nev ; public : AB( i n t i, s t r i n g s ) : B( i ), nev ( s ) { } void f ( ) ; } Izsó Tamás STL gyakorlat/ 3

1. b Adjon példát egy adatfolyam extractor deklarációjára! (1p) std : : istream& operator >>( std : : istream &, i n t & ) ; Izsó Tamás STL gyakorlat/ 4

1. c Az a) részfeladat összes osztálya rendelkezésére áll. Az std::list sablon felhasználásával hozzon létre egy olyan objektumot (data), amivel "tárolni" tud AB és BC típusú objektumpéldányokat is. Ezután a dinamikus memóriában hozzon létre 500 db AB példányt és egy BC példányt úgy, hogy később elérje azokat! Ügyeljen a konstruktorok paraméterezésére! (2p) Izsó Tamás STL gyakorlat/ 5

1. c std : : l i s t <B > data ;

1. c std : : l i s t <B > data ; for ( i n t i = 0; i < 500; i ++) data. push_back (new AB( i, "C++11 " ) ) ; data. push_back (new BC( false, 1 2 3 ) ) ; Izsó Tamás STL gyakorlat/ 6

1. d Mit ír ki az alábbi programrészlet a kimenetre? (1p) struct AA { v i r t u a l void g ( ) { std : : cout << "AA : : g " ; } } ; struct BB : public AA { void g ( ) { std : : cout << "BB : : g " ; } } ; i n t main { BB b ; b. g ( ) ; return 0; } Izsó Tamás STL gyakorlat/ 7

1. d Mit ír ki az alábbi programrészlet a kimenetre? (1p) struct AA { v i r t u a l void g ( ) { std : : cout << "AA : : g " ; } } ; struct BB : public AA { void g ( ) { std : : cout << "BB : : g " ; } } ; i n t main { BB b ; b. g ( ) ; return 0; } Kiírás: BB::g Izsó Tamás STL gyakorlat/ 7

1. e Mi a hiba az alábbi programrészletben? (1p) class A { A ( ) { } ~A ( ) { } } ; { A a ; } Izsó Tamás STL gyakorlat/ 8

1. e Mi a hiba az alábbi programrészletben? (1p) class A { A ( ) { } ~A ( ) { } } ; { A a ; } A összes tagfüggvénye privát. Izsó Tamás STL gyakorlat/ 8

Singleton osztály (érdekesség) Van-e értelme olyan osztálynak, aminek minden konstruktora privát? class Singleton { public : s t a t i c Singleton getinstance ( ) { i f ( instance == 0 ) instance = new Singleton ; return instance ; } ~ Singleton ( ) {... } ; private : Singleton ( ) {... } ; s t a t i c Singleton instance ; } ; Singleton Singleton : : instance =0; Izsó Tamás STL gyakorlat/ 9

1. f Jelölje, hogy igaz (I) vagy hamis (H)! (2p) A throw utasítás értéket dob, ezért másoló konstruktort hívhat. A konstruktor előbb hajtja vére a programozott törzset, és csak ezután hívja a tartalmazott objektumok konstruktorait. Pointerek kasztolásánál a cím sohasem változik meg. A dynamic_cast mindig sikerül. Izsó Tamás STL gyakorlat/ 10

1. f Jelölje, hogy igaz (I) vagy hamis (H)! (2p) A throw utasítás értéket dob, ezért másoló konstruktort hívhat. A konstruktor előbb hajtja vére a programozott törzset, és csak ezután hívja a tartalmazott objektumok konstruktorait. Pointerek kasztolásánál a cím sohasem változik meg. A dynamic_cast mindig sikerül. igaz Izsó Tamás STL gyakorlat/ 10

1. f Jelölje, hogy igaz (I) vagy hamis (H)! (2p) A throw utasítás értéket dob, ezért másoló konstruktort hívhat. A konstruktor előbb hajtja vére a programozott törzset, és csak ezután hívja a tartalmazott objektumok konstruktorait. Pointerek kasztolásánál a cím sohasem változik meg. A dynamic_cast mindig sikerül. igaz hamis Izsó Tamás STL gyakorlat/ 10

1. f Jelölje, hogy igaz (I) vagy hamis (H)! (2p) A throw utasítás értéket dob, ezért másoló konstruktort hívhat. A konstruktor előbb hajtja vére a programozott törzset, és csak ezután hívja a tartalmazott objektumok konstruktorait. Pointerek kasztolásánál a cím sohasem változik meg. A dynamic_cast mindig sikerül. igaz hamis hamis Izsó Tamás STL gyakorlat/ 10

1. f Jelölje, hogy igaz (I) vagy hamis (H)! (2p) A throw utasítás értéket dob, ezért másoló konstruktort hívhat. A konstruktor előbb hajtja vére a programozott törzset, és csak ezután hívja a tartalmazott objektumok konstruktorait. Pointerek kasztolásánál a cím sohasem változik meg. A dynamic_cast mindig sikerül. igaz hamis hamis hamis Izsó Tamás STL gyakorlat/ 10

2. a Készítsen adapter sablont (PhyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, melynek van at () tagfüggvénye. Egy N elemű PhyTomb elemei pozitív és negatív indexértékkel is elérhetők. Míg a pozitív indexértékek a szokásos elérést eredményezik, addig a negatív indexek a tömb végétől haladnak visszafelé. A 1 az utolsó elemet adja, a N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként N = 3, a tároló pedig az std :: vector legyen! Ügyeljen arra, hogy a sorozattárolókra jellemző konstruktorok elérhetőek legyenek! A sorozattároló minden tagfüggvénye legyen elérhető, kivéve az operator[]! Példa a használatra: (4p) Izsó Tamás STL gyakorlat/ 11

2. a Készítsen adapter sablont (PhyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, melynek van at () tagfüggvénye. Egy N elemű PhyTomb elemei pozitív és negatív indexértékkel is elérhetők. Míg a pozitív indexértékek a szokásos elérést eredményezik, addig a negatív indexek a tömb végétől haladnak visszafelé. A 1 az utolsó elemet adja, a N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként N = 3, a tároló pedig az std :: vector legyen! Ügyeljen arra, hogy a sorozattárolókra jellemző konstruktorok elérhetőek legyenek! A sorozattároló minden tagfüggvénye legyen elérhető, kivéve az operator[]! Példa a használatra: (4p) Izsó Tamás STL gyakorlat/ 11

2. a Készítsen adapter sablont (PhyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, melynek van at () tagfüggvénye. Egy N elemű PhyTomb elemei pozitív és negatív indexértékkel is elérhetők. Míg a pozitív indexértékek a szokásos elérést eredményezik, addig a negatív indexek a tömb végétől haladnak visszafelé. A 1 az utolsó elemet adja, a N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként N = 3, a tároló pedig az std :: vector legyen! Ügyeljen arra, hogy a sorozattárolókra jellemző konstruktorok elérhetőek legyenek! A sorozattároló minden tagfüggvénye legyen elérhető, kivéve az operator[]! Példa a használatra: (4p) Izsó Tamás STL gyakorlat/ 11

2. a Készítsen adapter sablont (PhyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, melynek van at () tagfüggvénye. Egy N elemű PhyTomb elemei pozitív és negatív indexértékkel is elérhetők. Míg a pozitív indexértékek a szokásos elérést eredményezik, addig a negatív indexek a tömb végétől haladnak visszafelé. A 1 az utolsó elemet adja, a N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként N = 3, a tároló pedig az std :: vector legyen! Ügyeljen arra, hogy a sorozattárolókra jellemző konstruktorok elérhetőek legyenek! A sorozattároló minden tagfüggvénye legyen elérhető, kivéve az operator[]! Példa a használatra: (4p) Izsó Tamás STL gyakorlat/ 11

2. a Készítsen adapter sablont (PhyTomb), ami minden olyan szabványos sorozattárolóra alkalmazható, melynek van at () tagfüggvénye. Egy N elemű PhyTomb elemei pozitív és negatív indexértékkel is elérhetők. Míg a pozitív indexértékek a szokásos elérést eredményezik, addig a negatív indexek a tömb végétől haladnak visszafelé. A 1 az utolsó elemet adja, a N pedig az első elemet. Úgy alakítsa ki a sablont, hogy alapértelmezésként N = 3, a tároló pedig az std::vector legyen! Ügyeljen arra, hogy a sorozattárolókra jellemző konstruktorok elérhetőek legyenek! A sorozattároló minden tagfüggvénye legyen elérhető, kivéve az operator[]! Példa a használatra: (4p) Izsó Tamás STL gyakorlat/ 11

2. a Használata: PhyTomb<int > t3 ( 3 ) ; / / 3 elemű i n t tömb t3. at ( 1 ) = 1; / / első eleme std : : cout << t3. at ( 3); / / ez i s az első t3. at ( 2 ) = 3; / / u t o l s ó eleme std : : cout <<< t3. at ( 1); / / u t o l s ó ( 3. ) elem Izsó Tamás STL gyakorlat/ 12

2. a template <typename T, i n t S = 3, class C = std : : vector <T> > class PhyTomb : public C { T& operator [ ] ( i n t i x ) ; T operator [ ] ( i n t i x ) const ; public : PhyTomb( s i z e _ t n = S, const T& value = T ( ) ) : C( n, value ) { } template <typename I t e r > PhyTomb( I t e r f i r s t, I t e r l a s t ) : C( f i r s t, l a s t ) { } T& at ( i n t i x ) { i f ( i x < 0) i x += S ; return C : : at ( i x ) ; } T at ( i n t i x ) const { i f ( i x < 0) i x += S ; return C : : at ( i x ) ; } } ; Izsó Tamás STL gyakorlat/ 13

2. b Hozzon létre az elkészített adapter és az std::deque felhasználásával egy 40 elemű long tömböt! PhyTomb<long, 40, s t d : : deque<long > > p40 ; Izsó Tamás STL gyakorlat/ 14

2. c Írjon C++ függvénysablont (count_if), ami iterátorokkal megadott adatsorozatban megszámolja azokat az elemeket, amire a paraméterként átadott predikátum igaz értéket ad! A függvény első két paramétere két iterátor, amivel a szokásos módon megadjuk a jobbról nyílt intervallumot. A függvény 3. paramétere pedig egy predikátum, ami egy egyparaméteres függvény vagy függvényobjektum. Ha jól oldja meg a feladatot, akkor az alábbi kódrészlet lefutása után az eredmény 2. bool negativ ( i n t a ) { return a < 0; } i n t sorozat [ ] = { 1, 4, 9, 16, 25, 3, 72, 100, 3 } ; / / a sorozat i n t eredmeny = c o u n t _ i f ( sorozat, sorozat +9, negativ ) ; Izsó Tamás STL gyakorlat/ 15

2. c megoldás template <class I, class P> i n t c o u n t _ i f ( I f i r s t, I l a s t, P pred ) { i n t cnt =0; while ( f i r s t!= l a s t ) i f ( pred ( f i r s t ++)) cnt ++; return cnt ; } Izsó Tamás STL gyakorlat/ 16

2. d megoldás Készítsen olyan függvényobjektum sablont, ami a count_if sablonnal felhasználva alkalmas az olyan elemek megszámolására, amelyek kisebbek a függvényobjektum konstruktorában megadott értéknél! template <class T> class KisebbMint { T r e f ; public : KisebbMint ( const T& a ) : r e f ( a ) { } bool operator ( ) ( const T& a ) const { return a < r e f ; } } ; Izsó Tamás STL gyakorlat/ 17

2. e megoldás A részfeladatok eredményeit felhasználva írjon kódrészletet, ami a b) részfeladatban létrehozott tömbben megszámolja a negatív elemeket! std : : cout << c o u n t _ i f ( p40. begin ( ), p40. end ( ), KisebbMint <long > ( 0 ) ) ; Izsó Tamás STL gyakorlat/ 18

3. feladat A Film osztályban házimozinkhoz tárolunk adatokat. class Film { std : : s t r i n g cim ; i n t polc ; public : Film ( const std : : s t r i n g & n = " ", i n t p = 0 ) ; i n t getpolc ( ) const ; std : : s t r i n g getcim ( ) const ; void setpolc ( i n t ) ; void setcim ( const std : : s t r i n g & ) ; v i r t u a l ~Film ( ) ; } ; Adott továbbá a Serializable osztály. struct S e r i a l i z a b l e { v i r t u a l void w r i t e ( std : : ostream& os ) const = 0; v i r t u a l void read ( std : : istream& i s ) = 0; v i r t u a l ~ S e r i a l i z a b l e ( ) { } } ; Izsó Tamás STL gyakorlat/ 19

3a. feladat A fenti osztályok felhasználásával, de azok módosítása nélkül hozzon létre a Film osztállyal kompatibilis, perzisztens PFilm osztályt! Megoldásában vegye figyelembe, hogy a címben szóköz is lehet! Az elmentett állapot visszatöltésekor az osztály végezzen ellenőrzést, hogy jó adatokat kap-e, azonban nem kell bombabiztos megoldás! Hiba esetén dobjon std :: out_of_range kivételt! Izsó Tamás STL gyakorlat/ 20

3a. feladat megoldás struct PFilm : public Film, public S e r i a l i z a b l e { PFilm ( const std : : s t r i n g & n = " ", i n t p = 0) : Film ( n, p ) { } void w r i t e ( std : : ostream& os ) const { os << " FILM " << std : : endl ; os << getcim ( ) << std : : endl ; os << getpolc ( ) << std : : endl ; } void read ( std : : istream& i s ) { std : : s t r i n g l i n e ; ( i s >> l i n e ). ignore ( 1 ) ; i f ( l i n e!= " FILM " ) throw std : : out_of_range ( " Film : : Read? " ) ; std : : g e t l i n e ( is, l i n e ) ;. setcim ( l i n e ) ; i n t a ; ( i s >> a ). ignore ( 1 ) ; setpolc ( a ) ; } } ; Izsó Tamás STL gyakorlat/ 21

3b. feladat Egy rövid kódrészletben hozzon létre egy PFilm példányt a kedvenc filmcímével. Mentse ki az objektum adatait a szabványos kimenetre! Kommentben adja meg, hogy mit írt ki! Jelölje a nem látható karaktereket is! Izsó Tamás STL gyakorlat/ 22

3b. feladat Egy rövid kódrészletben hozzon létre egy PFilm példányt a kedvenc filmcímével. Mentse ki az objektum adatait a szabványos kimenetre! Kommentben adja meg, hogy mit írt ki! Jelölje a nem látható karaktereket is! PFilm f3 ( "A d e s t r u k t o r bosszuja ", 2) f3. w r i t e ( std : : cout ) ; / / FILM \ na d e s t r u k t o r bosszuja \ n2 \ n Izsó Tamás STL gyakorlat/ 22

3c. feladat Tételezze fel, hogy rendelkezésére áll a gyakorlaton elkészített PKomplex osztály is, ami szintén a Serializable osztály segítségével valósítja meg a perzisztens viselkedést! Egészítse ki megoldását, hogy az alábbi kódrészlet az elvárásoknak megfelelően működjön! PFilm f1 ( " Vak asszony visszanez ", 1 ), f2 ( "A d e s t r u k t o r bosszuja ", 2 ) ; PKomplex k1 ( 2, 4 ) ; stringstream ss ; f1. w r i t e ( ss ) ; k1. w r i t e ( ss ) ; f2. w r i t e ( ss ) ; PFilm nf1, nf2 ; PKomplex nk1 ; ss >> nf1 >> nk1 >> nf2 ; Izsó Tamás STL gyakorlat/ 23

3c. feladat megoldása istream& operator >>( istream& is, S e r i a l i z a b l e& s ) { s. read ( i s ) ; return i s ; } Izsó Tamás STL gyakorlat/ 24

4. feladat A burkus király egységesíteni akarja a közalkalmazotti nyilvántartásokat. Egységes rendszerben (Registry) kell tárolni a közalkalmazottakat (Servant), akik az első verzióban katonák (Soldier) és az orvosok (Doctor) lehetnek, de később további szakmák dolgozóit (bírók, tanárok, stb) is kezelni kell tudni. A modell adjon támogatást arra, hogy vannak orvosok, akik egyben katonák is (Medic). A közalkalmazottaknak kiíratható (send) az azonosítója (id, string), a katonáknak a rendfokozata (rank, string), az orvosoknak pedig a diploma megszerzésének éve (year, int). A Medic-nek azonosítója, rendfokozata és diplomaszerzési éve is van, és kezelhető katonaként és orvosként is. Kiíratáskor a Medic minden adata kiíródik, nem baj, ha többször is. A kiíratást minden tárolt típusnál a függvényparaméterként megadott ostream-re lehet kérni. A Registry rendszerbe fel lehessen venni új közalkalmazottat (employ), illetve paraméterben megadott ostream-re ki lehessen írni a meglevő közalkalmazottak minden tárolt adatát (submit). Ha a Registry rendszer megsemmisül, a benne tárolt adatok is elvesznek. Izsó Tamás STL gyakorlat/ 25

4a UML ábra Registry -data:deque<servant*> +void employ(i:servant*) +void submit(os:ostream&) -id:string Servant +Servant(n:string) +virtual void Send(os:ostream&) +virtual ~Servant(); -rank:string Soldier +Soldier(n:string,r:string) +virtual void Send(os:ostream&) -year:int Doctor +Doctor(n:string,d:int) +virtual void Send(os:ostream&) Medic Medic(n:string, s:string, d:int) Izsó Tamás STL gyakorlat/ 26

4a. feladat class Servant { s t r i n g i d ; public : Servant ( s t r i n g n ) : i d ( n ) { } virtual void send ( ostream& os ) const ; v i r t u a l ~Servant ( ) ; } ; class Doctor : v i r t u a l public Servant { i n t year ; public : Doctor ( s t r i n g n, i n t d ) : Servant ( n ), year ( d ) { } virtual void send ( ostream& os ) const ; } ; class Soldier : v i r t u a l public Servant { s t r i n g rank ; public : Doctor ( s t r i n g n, s t r i n g r ) : Servant ( n ), rank ( r ) { } virtual void send ( ostream& os ) const ; } ; class Medic : public Soldier, public Doctor { public : Medic ( s t r i n g n, s t r i n g s, i n t d ) : Servant ( n ), S o l d i e r ( n, s ), Doctor ( n, d ) { } virtual void send ( ostream& os ) const ; } ; Izsó Tamás STL gyakorlat/ 27

4a. feladat class R e g i s t r y { vector <Servant > data ; public : void employ ( Servant i ) ; void submit ( ostream& os ) const ; } ; Izsó Tamás STL gyakorlat/ 28

4a. feladat void R e g i s try : : employ ( Servant s ) { data. push_back ( s ) ; } void R e g i s try : : submit ( ostream& os ) { for ( i n t i = 0; i < data. size ( ) ; i ++) data [ i ] >send ( os ) ; } void Servant : : send ( ostream& os ) { os << i d ; } void Doctor : : send ( ostream& os ) { Servant : : send ( os ) ; os << " " << year ; } void Medic : : send ( ostream& os ) { S o l d i e r : : send ( os ) ; os << " " ; Doctor : : send ( os ) ; } Izsó Tamás STL gyakorlat/ 29