(C++) Lehet létrehozni olyan vektort aminek minden eleme tetszőleges típusú?
Akkor, ha a vector minden eleménél ugyanaz az adatszerkezet, akkor egy struct-ot használhatsz.
Ha nem, akkor pedig két opciód van:
1. használsz egy dinamikus adattípus osztályt. Ezek úgy működnek, hogy egy érték és egy típus mutatót tartalmaznak, vagyis futásidőben meg lehet határozni a típusukat, de mégis fix hosszúságúak (2 mutató), így el lehet őket tárolni egy vektorban. Erre vannak kész megoldások, egész biztosan.
2. Az összes vectorba kerülő objektum osztályát a vector template típusából eredezteted, és beágyazott vektort használsz. pl így.
class AlapTípus {};
class Valami : AlapTípus {};
vector<vector<AlapTípus>> v;
Ebben a példában a v vector elemeibe Valami és AlapTípus típusú objektumokat is be lehet illeszteni. Hogy ez hogyan valósul meg, az változó, de nem kell vele foglalkoznod. A C++ szabvány előírja, hogy ennek a megoldásnak tökéletesen működni kell.
"Utolsó: a 2. pontod nettó baromság. A belső vektor típusa kötődik a T típushoz, a külsőé pedig a belső vektorhoz. Nem tudsz belerakni leszármazott típusokat (a kód fordulhat, ha úgy vannak megírva a típusok, de akkor is ősosztály objektum lesz benne). Amire gondolsz az a pointerezés."
Jogos, ezt hívják object slicing-nek. Valóban pointert kell átadni a base class-hoz. Viszont, ha a polimophikus függvények virtual-ként vannak megvalósítva, akkor így működnie kell. Szerintem, ez az esetek többségében jobb, mint az első megoldás, ugyanis ne akarjunk már bármilyen objektumot beletenni. Szerintem általában csak az a típust lehessen beletenni, ami arra lett tervezve. Ez jobban kizárja a hibalehetőséget szerintem. Meg átláthatóbb is.
használhatsz akár uniont is, amiben olyan classokat tárolsz,
amiknek az első tagja egy enum a tartalmazott típusra vonatkozólag,
a második pedig maga a típuspéldány (már ha mindenáron a kérdésben szereplő dolog kell)
viszont ez annyira gány, és semmire nem való, hogy inkább csak mutatom:
enum StoresWhat {integer, doublep};
class Int_class {
public:
StoresWhat type;
int data;
void set(int x) {type=integer; data=x;}
};
class Double_class {
public:
StoresWhat type;
double data;
void set(double x) {type=doublep; data=x;}
};
union Collection {
StoresWhat type;
Int_class m_int;
Double_class m_double;
};
int main() {
std::vector<Collection> tarolo;
Collection x,y;
x.m_int.set(5);
y.m_double.set(6.5);
tarolo.push_back(x);
tarolo.push_back(y);
return 0;
}
Akár használhatsz class templatet is, aztán heterogén kollekció:
class WrapperBase {
public:
StoresWhat type;
};
template<class T>
class Wrapper : public WrapperBase {
public:
T data;
};
De inkább pontosítsd a problémádat, biztos sokkal egyszerűbb a megoldás mint ez a sok okádék
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!