Najprostszym sposobem przechowywania wielu typów w tym samym wektorze jest nadanie im podtypów klasy nadrzędnej, zawijanie żądanych typów w klasy, o ile nie są już klasami.
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();
};
Następnie można utworzyć wektor Parent
wskaźników, które mogą przechowywać wskaźniki do typów dziecko:
std::vector<Parent*> vec;
vec.push_back(new Type1);
vec.push_back(new Type2);
vec.push_back(new Type3);
Podczas uzyskiwania dostępu do elementów bezpośrednio z wektora, będziesz mógł korzystać tylko członkom, że należą do Parent
. Na przykład, można napisać:
vec[0]->print();
lecz nie:
vec[0]->type1Method();
jako typ element został zadeklarowany jako Parent*
oraz typ Parent
ma type1Method
.
Jeśli chcesz uzyskać dostęp do członków podtypów specyficzny, można konwertować Parent
wskaźniki do podtypu wskazówek tak:
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();
}
Mimo to powszechnie uważany za lepszy pomysł, aby uniknąć tego rodzaju wyraźnej typu rozgałęzienia i zamiast tego polegać na metodach wirtualnych.
Pamiętaj, aby usunąć wskaźniki przed usunięciem ich z wektora, jeśli używasz alokacji dynamicznej, tak jak to zrobiłem w powyższym przykładzie. Alternatywnie, użyj inteligentne kursory (prawdopodobnie std::unique_ptr
i niech pamięć dbać o siebie:
std::vector<std::unique_ptr<Parent>> vec;
Prawdopodobnie potrzebny byłby pewien typ klasy/kontenera otoki do przechowywania odniesień do różnych typów. Podobne pytanie [tutaj] (http://stackoverflow.com/questions/13461869/c-push-multiple-types-onto-vector) – Abbath
Zobacz ['tuple'] (http://www.cplusplus.com/reference/tuple /), być może. Wektory (aka list) są sekwencjami jednego lub więcej * homogenicznych * przedmiotów. Krotki to skończone (i o ustalonej wielkości) zbiory możliwych heterogenicznych członków. – user2864740
Czy chcesz mieć wektor, którego elementy zawierają wszystkie 3 typy? Lub wektor, który może zawierać jeden typ lub inne? – Galik