Kezdőoldal » Számítástechnika » Programozás » Nem bírom ezt megérteni,...

Nem bírom ezt megérteni, hogyan értelmezzem?

Figyelt kérdés

Virtuális másoló konstruktorok

Ahogy korábban már említettük, a konstruktorok nem lehetnek virtuálisak. Ennek ellenére

vannak helyzetek, amikor programunk kétségbeesetten próbál beszuszakolni valahova

egy bázisosztálybeli objektumot címző mutatót, és próbálja megszerezni a létrejövő

származtatott objektum másolatát. Ennek a problémának jól bevált megoldása,

hogy egy másoló metódust hozunk létre a bázisosztályban, majd virtuálissá tesszük.

A másoló metódus létrehozza az aktuális objektum másolatát, és ezt adja vissza Visszatérési értékként.

Mivel minden származtatott osztály felülírja a másoló metódust, a származtatott osztályok

példányai jönnek létre.


Ezt az egészet nem értem pedig van hozzá példám is.

Nem tudom értelmezni fejben nincs hozzá agyam segítsetek.


2012. máj. 28. 19:12
 1/8 iostream ***** válasza:

Te vagy a cicás-emlősös b*zizó, mindenkit lehülyéző kedves kérdező?


Ha van példád is, akkor mit nem értesz rajta?


Az alap probléma, hogy hogy készítek másolatot egy objektumról, ha nem tudom a típusát? Nem tudom azt mondani, hogy new XY(objektum_amiről_másolni_akarok); mert nem tudom, mi az XY.

Erre megoldás, hogy minden osztály implementálja a Clone() virtuális függvényt, amiben annyit csinál, hogy lemásolja önmagát (hiszen ő pontosan tudja, mi az ő típusa), és visszaadja a másolatra mutató pointert.

Létrehozol egy függvényt.

2012. máj. 28. 21:11
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:

Nem értem még mindig.

Miért van szükség erre az egészre.

2012. máj. 28. 23:32
 3/8 A kérdező kommentje:
Tudna valaki erről ég részletesebben magyarázatot nyújtani mert nem értem.
2012. máj. 29. 02:50
 4/8 anonim ***** válasza:
Hát nem tom pontosan mire gondol, de én úgy értelmezem, mint ahogy írja, hogy a származtató osztály konstruktora nem lehet virtuális, tehát lemásolja, még az ős osztályban, és virtuálissá teszi a másolatot, majd ez használható a származtatott osztályoknál. Asszem erről van szó röviden.
2012. máj. 29. 08:06
Hasznos számodra ez a válasz?
 5/8 iostream ***** válasza:

"a származtató osztály konstruktora nem lehet virtuális, tehát lemásolja, még az ős osztályban, és virtuálissá teszi a másolatot, majd ez használható a származtatott osztályoknál"


Ennek semmi értelme. Függvényt nem tudsz lemásolni. Ha meg nem függvényről van szó, akkor azt meg nem tudod virtuálissá tenni.


Azért van szükség erre, mert ha van egy osztályhierarchiád:

class A {};

class B: public A {};

class C: public A {};


és van egy gyűjteményed A*-okból, amik vagy B, vagy C típusú objektumokra mutatnak, de nem tudod melyik melyik, és te szeretnél másolatot készíteni valamelyik objektumról, arra nincs triviális módszer.

Van egy A*-od, és szeretnél egy másik A*-ot, ami egy másolatára mutat az eredeti mutató által mutatott objektumnak.

2012. máj. 29. 09:31
Hasznos számodra ez a válasz?
 6/8 A kérdező kommentje:

iostream a te válaszodat megint nem értem de az előtted szólóét igen.

Nem rosszból :(

2012. máj. 29. 15:09
 7/8 Srapnel ***** válasza:
75%

A konstruktor nem lehet virtuális, hiszen amikor konstruálsz egy new-val, akkor egyrészt a new kulcsszó mögé úgyis egy konkrét osztály nevét kell írnod, másrészt nincs is még objektum, aminek a metódusát meghívhatnád, tehát ha nincs objektum, nincs metódus és nincs minek virtuálisnak lennie. Ez nem baj, egész addig, amíg olyan objektumot kell létrehoznod, aminek nem tudod a konkrét típusát (fordítási időben), így nem is tudod new-val létrehozni.


Ha van egy objektumod és történetesen neked a másolatára lenne szükséged (mert tegyük föl, szaporodnak), akkor mit tennél egyszerű esetben? Létrehozol new-val egy újat, majd beállítod a belsejét/állapotát/attribútumait úgy, hogy pont a másolata legyen a másolandónak. Így már van kettő belőlük.


Na aztán mi van akkor, amikor a másolandó típusát nem ismered pontosan, max. csak azt, hogy egy adott ősosztály valami leszármazottja? Pl. Ha vannak Síkidom osztályod, amiből a Kör, meg a Négyzet leszármazik (hisz' mindkettő síkidom) és valaki copy-paste-tel másolni akar egy síkidomot. Amid van: egy referencia egy Síkidomra. Ami lehet Kör, Négyzet, Macika, akármi (hisz nem tudhatod, hogy később mi minden síkidomot definiálnak még). Azt viszont tudod, hogy másolni akarod, akármi is az. A new operátor ugrott, mivel fogalmad sincs, hogy mi a konkrét típusa, hogy beírhasd a new mögé.


Ekkor persze, buta módon csinálhatsz egy switch-case-t arra, hogy lekérdezd a másolandó síkidom típusát instanceof-fal (vagy bármi hasonló dologgal az adott nyelven) és az eredmény függvényében már tudod, hogy mit new-oljál.


Sokkal okosabb megoldás, ha minden síkidom oda tudja neked adni a másolatát, ahelyett, hogy te csinálnád meg. Ehhez kell egy virtuális metódus a síkidomba (hiszen most itt minden síkidomra kéred a másolás képességét). Miért virtuális? Mert a síkidom osztályban te nem mondod még meg, hogy hogyan is történjen a másolás (mivel nem is tudod), mert az attól függ, hogy melyik síkidomról van szó. A kör másolását a virtuális másoló metódusnak a Kör-ben lévő megvalósítása fogja adni, hasonlóan a Négyzetnél is. A Kör-ben lévő megvalósítás már tud new Kör-t csinálni, a Négyzet meg new Négyzet-et.


Tehát, ha van egy síkidomod és annak egy "másol" metódusa, ami egy másolat síkidommal tér vissza, akkor mi történik, ha meghívod? Tegyük föl, hogy a síkidomod valójában egy Kör. Ekkor, mivel a metódus virtuális, a Kör-ben lévő, kört másoló metódusimplementáció fog lefutni, ami létrehoz neked egy új Kör objektumot, majd visszaadja azt síkidomként (amit megtehet, hiszen minden Kör Síkidom is). Voilá! Van egy új Kör-öd, úgy, hogy nem tudod, hogy eredetileg egy körből lett másolva, meg azt sem, hogy ez egy Kör, csak azt hogy egy Síkidom.

2012. máj. 29. 15:51
Hasznos számodra ez a válasz?
 8/8 A kérdező kommentje:

Igen jó köszi .D

Akkora zöld kéz ment amekkorát még nem látott a gyík.

2012. máj. 29. 15:59

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!