Die einfachste Möglichkeit, mehrere Typen in einem Vektor zu speichern, besteht darin, sie zu Subtypen einer übergeordneten Klasse zu machen und die gewünschten Typen in Klassen zu verpacken, wenn sie noch keine Klassen sind.
class Parent
{
//anything common to the types should be declared here, for instance:
void print() //make this virtual if you want subclasses to override it
{
std::cout << "Printing!";
}
virtual ~Parent(); //virtual destructor to ensure our subclasses are correctly deallocated
};
class Type1 : public Parent
{
void type1method();
};
class Type2 : public Parent
{
void type2Method();
};
class Type3 : public Parent
{
void type3Method();
};
Sie dann einen Vektor von Parent
Zeiger erstellen können, die Zeiger auf die Kind-Typen speichern kann:
std::vector<Parent*> vec;
vec.push_back(new Type1);
vec.push_back(new Type2);
vec.push_back(new Type3);
Wenn Elemente direkt aus dem Vektor zugreifen können, können Sie nur in der Lage sein, Mitglieder zu verwenden, die gehören zu Parent
. Zum Beispiel können Sie schreiben:
vec[0]->print();
aber nicht:
vec[0]->type1Method();
als Elementtyp hat als Parent*
und der Parent
Typ keine type1Method
erklärt wurde.
Wenn Sie die Subtyp-spezifischen Mitglieder zugreifen müssen, können Sie die Parent
Zeiger konvertieren Zeiger auf Subtyp wie so:
Parent *p = vec[0];
Type1 *t1 = nullptr;
Type2 *t2 = nullptr;
Type3 *t3 = nullptr;
if (t1 = dynamic_cast<Type1*>(p))
{
t1->type1Method();
}
else if (t2 = dynamic_cast<Type2*>(p))
{
t2->type2Method();
}
else if (t3 = dynamic_cast<Type3*>(p))
{
t3->type3Method();
}
Obwohl es in der Regel eine bessere Idee zu vermeiden, diese Art von expliziten Typ-Verzweigung betrachtet hat und sich stattdessen auf virtuelle Methoden verlassen.
Achten Sie darauf, die Zeiger zu löschen, bevor Sie sie aus dem Vektor entfernen, wenn Sie die dynamische Zuordnung verwenden, wie im obigen Beispiel. Alternativ können Sie intelligente Zeiger (wahrscheinlich std::unique_ptr
und lassen Sie Ihre Erinnerung an sich selbst kümmern:
std::vector<std::unique_ptr<Parent>> vec;
Sie benötigen wahrscheinlich eine Art Wrapper-Klasse/Container, die Verweise auf die verschiedenen Typen enthält. Eine ähnliche Frage [hier] (http://stackoverflow.com/questions/13461869/c-push-multiple-types-onto-vector) – Abbath
Siehe ['tuple'] (http://www.cplusplus.com/reference/tuple /), vielleicht. Vektoren (auch Listen genannt) sind Sequenzen von einem oder mehreren * homogenen * Items. Tupel sind endliche (und feste Größe) Sammlungen von möglichen heterogenen Mitgliedern. – user2864740
Möchten Sie einen Vektor haben, dessen Elemente alle drei Typen enthalten? Oder ein Vektor, der einen Typ oder die anderen enthalten kann? – Galik