Generikus listában megtalálni az egyik leszármazottat C++-ban?
Van egy A-kat tartalmazó generikus listám.
Léteznek B, C, D, E, F, G, .... osztályok, amik A-tól származnak.
C++-ban hogyan tudom effektíven, biztonságosan megtalálni mondjuk a C típusúakat?
A típus közvetlen lekérdezése gondolom nem elfogadható.
Másik amire még gondoltam, hogy <string, A> map lenne a container, és akkor GetObject<Type>("string") alapján visszakaphatom. De ez se jó, mert a string elég sok hibalehetőséget enged meg.
Előre is köszi a segítséget.
A legegyszerűbb, ami eszembejut, hogy osztályszinten konstans azonosítókat használsz, amit az egyes leszármazott osztályokban más értéknek állítasz be. A hibalehetőségek minimalizálására enum értékeket is használhatsz. Így a keresésnél csak az osztályazonosítót kell megadnod, és az alapján kiszűrheted a megfelelő objektumokat.
De persze az első és legfontosabb kérdés, hogy TÉNYLEG szükséges-e vegyesen tárolnod a leszármazott objektumokat.
Miért van egy generikus listád, ha csak a C-k kellenek belőle?
Mit akarsz velük csinálni, miután megtudtad, hogy ők "C"-k?
Nem lenne jobb, ha inkább megmondanád az összes objektumnak, hogy mit csináljon (A metódus), és aki C, az majd tudja, hogy neki milyen specifikus dolgot kell tenni (override-olt A metódus)?
"valamilyen lekérdezés eredményeként kizárólag a kutyákat ki kell listáznia"
Ez így oké (nagyjából), de az már elég homály, azt állítani, hogy ehhez rtti kell, vagy akár kellhet.
Azért kell nekem pont C, mert az végzi az egyik feladatot, és valamit állítani akarok rajta. Aztán kell a D, mert az meg mást csinál.
És ezeket a feldolgozó egységeket dinamikusan lehessen fel és lecsatolni, akár többet is egy fajtából.
Végül C++11-es unorderer_multimap<enum, A*> mellett telepedtem le.
Elég gyors és 1 kulcshoz több értéket is lehet rendelni.
Tudod, mi a baj kedves kérdező?
Hogy a leszármazottak több információt tárolnak, mint az ősök. Végigiterálsz a tömbön, ha jön egy elem egy leszármazottból, akkor a pointer aritmetika nem észleli, hogy ez most nem az ősosztály eleme. Rálépsz az elemre, és csak azok az adattagjai lesznek meg, amik az ősnek is megvoltak. Ha továbblépsz, akkor pedig szemetet kapsz, mert az még ehhez az elemhez tartozott, de már a következőhöz számítja. Hasonló lehet a baj az indexeléssel is.
Maradj a külön listáknál!
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!