Kezdőoldal » Számítástechnika » Programozás » Generikus listában megtalálni...

Generikus listában megtalálni az egyik leszármazottat C++-ban?

Figyelt kérdés

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.


2016. dec. 2. 15:06
 1/7 anonim ***** válasza:
Tegyed a különböző osztályok tagjait külön listába, mert amit akarsz, az nem valószínű, hogy jó.
2016. dec. 2. 18:39
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:

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.

2016. dec. 2. 19:10
Hasznos számodra ez a válasz?
 3/7 anonim ***** válasza:

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)?

2016. dec. 2. 19:11
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:
Számos oka lehet, hogy pont a C típusúak kellenek neki, teszem azt Kutya, Macska, Lapostetű osztályok, amik mind az Állat ősosztály leszármazottai, és valamilyen lekérdezés eredményeként kizárólag a kutyákat ki kell listáznia. Például. Nem generalizálható minden, néha muszáj szelektálni.
2016. dec. 2. 19:20
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:

"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.

2016. dec. 2. 20:34
Hasznos számodra ez a válasz?
 6/7 A kérdező kommentje:

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.

2016. dec. 2. 20:35
 7/7 anonim ***** válasza:

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!

2016. dec. 3. 17:20
Hasznos számodra ez a válasz?

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!