Презентация загружается. Пожалуйста, подождите

Презентация загружается. Пожалуйста, подождите

C++ programozási nyelv Gyakorlat hét

Similar presentations


Presentation on theme: "C++ programozási nyelv Gyakorlat hét"— Presentation transcript:

1 C++ programozási nyelv Gyakorlat - 13. hét
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. december

2 Tartalomjegyzék Objektumok másolása
Másoló konstruktor és értékadás operátor letiltása Hogyan írjuk meg egy értékadó operátort ill. másoló konstruktort? Statikus és dinamikus tartalmazás osztályok között Segítő objektum Opcionális adatok A polimorfizmus használata

3 Objektumok másolása Milyen módokon másolhatunk objektumokat?
másoló konstruktorral értékadás operátorral saját függvénnyel, vagy metódussal Ha mi nem tesszük meg, akkor a fordító hoz létre helyettünk másoló konstruktort és/vagy értékadás operátort, ami adattagonként bitenkénti másolást végez. Mikor veszélyes ez? tulajdonolt dinamikus memória esetén fájlok, adatbázisok használata esetén általánosságban, különböző erőforrások használatakor Hasznos tanács: Ha ilyen osztályt definiálunk, akkor rögtön tiltsuk le a másoló konstruktort és az értékadás operátort. Ha majd szükség lesz rájuk, akkor megírjuk őket.

4 Másoló konstruktor és értékadás operátor letiltása
class Valami { public: ... private: Valami( Valami & masik ); Valami& operator=( Valami & masik ); }; Mi történik, ha ezek után megpróbálunk lemásolni egy valami típusú objektumot? Próbáljuk ki!

5 Hogyan írjuk meg egy értékadó operátort ill. másoló konstruktort?
A másoló konstruktor és az értékadó operátor ugyanazt a feladatot látja el (objektum adattagjainak átmásolása), azonos esetekben működnek jól, vagy okoznak problémát. Ezért, ha az egyiket letiltjuk, vagy definiáljuk, akkor a másikat is célszerű. Mivel lényegében ugyanazt csinálják, ezért érdemes egy külön private metódusban megírni a lényeget, és annak segítségével definiálni a másoló konstruktort és az értékadó operátort. Nézzük meg a Sztringem.cpp fájlt!

6 Statikus és dinamikus tartalmazás osztályok között
Nézzük meg a következő osztályt: class A { B b; // statikus tartalmazás C *c; // dinamikus tartalmazás } Mikor használjuk az egyik és mikor a másik megoldást? Mindkettőnek vannak előnyei és hátrányai egyaránt. Melyik mennyivel növeli az A osztály méretét? Mikor futnak le automatikusan a konstruktorok és a destruktorok? ez előny vagy hátrány? Vizsgáljuk meg a következő speciális eseteket: segítő objektum opcionális adatok

7 Segítő objektum Adott egy osztály, ami valamilyen szolgáltatást nyújt másoknak. Ekkor az igénybevevő objektumok ahelyett, hogy globális változón keresztül érnék el a szolgáltatót, megkaphatják a szolgáltató objektum címét, amit eltárolnak egy tagváltozó pointerben. Ha nem pointerben tárolná a szolgáltatót, hanem statikus tartalmazással építené be magába, akkor minden ilyen objektum létrehozna egy saját példányt a szolgáltatóból. Ez idő és memória veszteséggel járna, és lehetnek olyan esetek, amikor fogalmilag sem lehetséges több példány létrehozása. Példa az előadáson: Hanglejátszó objektum

8 Opcionális adatok Tegyük fel, hogy adatokat akarunk nyilvántartani és kezelni. Az adatok között vannak olyanok, amelyek az esetek egy jelentős részében üresen marad. Például embereket tartunk nyilván az önkormányzatnál akinek van autója, annak az autó adatait is kezelni akarjuk van akinek nincs autója, és van akinek több is van Ha minden emberhez eltárolnánk egy autó adatait, akkor feleslegesen pazarolnánk, főleg, ha 2-3 autót tárolnánk felkészülve arra, hogy néha lehet egy embernek több autója. Ilyenkor csak egy pointert tartunk fenn, amivel rámutatunk egy autó rekordra, vagy autó listára, vagy NULL, ha nincs autója. Tehát az opcionális adatokat legtöbbször dinamikus tartalmazással építjük be.

9 A polimorfizmus használata
Például: Egész számokat akarunk tárolni valamilyen listában. A listát többféleképpen implementálhatjuk, pl. tömbbel, egyszeresen, kétszeresen láncolt listában, stb. Most meg is írunk több variációt, hogy minden helyzetben kiválaszthassuk a legjobb variánst. A lista műveletei között szeretnénk definiálni két lista összefűzését is. Egy programban előfordulhat, hogy több listát használunk, akár különböző implementációjúakat is. Ezeket is szeretnénk tudni összefűzni. Ehhez minden párosításra meg kell írnunk az összefűző metódusokat. Ha definiálunk egy újabb lista variációt, akkor minden típushoz meg kell írni az új összefűző metódust.

10 Példa polimorfizmus használatára, folyt.
Ha azonban definiálunk egy absztrakt lista típust, akkor elég az ezzel való összefűzést megvalósítani. A polimorfizmus révén ez minden leszármazott típussal működni fog. Nézzük meg mindezt konkrétan: poli1a.cpp poli1b.cpp poli1c.cpp poli1d.cpp poli1e.cpp


Download ppt "C++ programozási nyelv Gyakorlat hét"

Similar presentations


Ads by Google