Van ilyen adatszerkezet c++ban?
Lehet csinálj, olyan adatszerkezet, mely osztály on mutatóit tárolja?
Tehát pl van egy class Cseresznyefa{} és a mainben Cseresznyefa *cseresznyefa.
Na ezt a *cseresznyefa és más osztályok mutatóit, hogy lehet tömbbe, vagy bármibe berakni.
Akkor lehet, hogy rosszul fogalmaztam:
Egy ilyesmit keresek, hogy:
valami[*cseresznyefa, *akacfa, ....];
De úgy hogy előtte deklarálom őket így:
Cseresznyefa *cseresznyefa = new Cseresznyefa();
Akácfa *akácfa = new Akácfa();
És aztán rakom őket tömbbe, vagy valamilyen adatszerkezetbe. Hogy megtehessem azt, hogy
valami[0]->getTermes(); Ez lényegében ez lenne
cseresznyefa->getTermes();
Esetleg próbáld meg az objektumorientált programozást arra használni, amire jó.
Csinálsz egy Fa ősosztályt, melynek Cseresznyefa és Almafa a leszármazott osztályai lesznek. Ekkor:
Cseresznyefa* csfa = new Cseresznyefa();
Almafa* afa = new Almafa();
Fa* tomb[] = {csfa, afa};
Felmerül a kérdés, minek hajigálnál össze olyan dolgokat, amiknek nincs közük egymáshoz.
Ha van közük egymáshoz, akkor
a) Egy részük átemelhető egy közös ősosztályba.
b) Összedolgoznak valamihez. Egy harmadik osztály tagjai lesznek, amely képviseli ezt a valamit.
c) Az egyik használja a másikat. A használt osztály a használó tagja lesz.
Ahogyan a kolléga előttem is jelezte, te gyaníthatólag az A esetre gondolsz: mindkettő fa, tehát kell nekik egy Fa ősosztály.
Ha nem erre gondoltál, akkor viszont nem tudjuk, konkrétan mit szeretnél megvalósítani, félhomályban tapogatózva pedig nehéz tanácsot adni.
Egyébiránt a tömb rugalmatlan, problémás adatszerkezet, és nem is igazán OO (lásd: primitive obsession). Van vector vagy list, érdemes azt használni.
Csak hogy értsd, hogy amit írsz miért nem lehetséges:
Van két osztályod, legyen cseresznyefa, meg akácfa. Két teljesen különböző osztály, semmi közük egymáshoz.
Deklarálsz egy tömböt, vagy akármilyen tároló szerkezetet, amibe ezeket bepakolod. Rendben. De ha később használni akarod őket, akkor előjönne a probléma:
Írsz egy kódot, hogy vegye elő a tömböd i. elemét, és hajtson végre rajta valamit. Na de honnan tudhatjuk, hogy a tömböd i. elemében olyan elem van, amin végre tudod hajtani a kívánt utasítást? Lehet, hogy a cseresznyefán végre tudod hajtani, de az akácfán nem. Amikor a programod fordul, akkor a fordítód nem fogja tudni, hogy később melyik pozícióra milyen elemeket pakolsz. Épp ezért ezt nem engedi a szabvány. A C++ egy erősen típusos nyelv, és ehhez hozzátartozik az, hogy tárolókba csak egy meghatározott, előre deklarált típust pakolhatsz.
Kivéve amikor mégsem. Arra ugyanis van lehetőséged, hogy a cseresznyefa és az akácfa osztályok hasonlóságait kiszervezed egy Fa osztályba, és az említett két osztályt ebből származtatod le. Ezesetben a Cseresznyefa osztály objektumai egyben Fa objektumok is lesznek., ugyanígy az Akácfa osztálynál. Ami azt jelenti, hogy ha létrehozol egy tárolót (tömböt), amibe Fa típusú elemeket pakolsz, abba tudsz rakni Cseresznyefa és Akácfa típusú elemeket is. Viszont azt tartsd szem előtt, hogy hiába van benne Cseresznyefa, a fordítód azt Fa objektumként fogja kezelni, éppezért csak olyan műveleteket fog engedélyezni a tömb elemeire, amik a Fa ősosztályon definiálva vannak. Itt jönnek elő olyan dolgok mint virtuális metódusok, meg override.
Kielégítő volt a válasz?
Tökéletesen kielégítő volt a válasz.
Egy másik helyen ajánlották a factory metódust is.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!