Aynı vektörde birden çok türün saklanmasının en kolay yolu, bir alt sınıfın alt türlerini yapmaktır; bunlar, daha önceden sınıflar değilse, istediğiniz türlerde sınıfları sarar.
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();
};
Daha sonra çocuk türlerine işaretçileri saklayabilir
Parent
işaretçiler vektör oluşturabilir
: vektör doğrudan erişim için kullanılan
std::vector<Parent*> vec;
vec.push_back(new Type1);
vec.push_back(new Type2);
vec.push_back(new Type3);
, sadece üyelere kullanmak mümkün olacak Parent
'a aittir.
vec[0]->print();
Ama: Örneğin, yazabilir eleman tipi Parent*
olarak ilan edilmiştir gibi
vec[0]->type1Method();
ve Parent
türünün type1Method
sahiptir. Eğer alt tip spesifik üyeleri erişmek gerekirse
, bunu böyle işaretçileri alt tip için Parent
işaretçiler dönüştürebilirsiniz:
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();
}
genellikle açık tip dallanma böyle bir durumu önlemek için daha iyi bir fikir olarak kabul rağmen ve bunun yerine sanal yöntemlere güvenir.
Yukarıdaki örnekte yaptığım gibi, dinamik ayırma kullanıyorsanız, vektörlerden çıkarmadan önce işaretçileri sildiğinizden emin olun. Alternatif olarak, (muhtemelen std::unique_ptr
akıllı işaretçileri kullanmak ve bellek kendisi ilgilenelim: 3 farklı veri türlerini saklayabilirsiniz C bir vektör ++ yapmaya çalışıyorum
std::vector<std::unique_ptr<Parent>> vec;
Farklı türlerdeki başvuruları saklamak için bir çeşit sarmalayıcı sınıfına/kapsayıcısına gereksiniminiz olabilir. Benzer bir soru [burada] (http://stackoverflow.com/questions/13461869/c-push-multiple-types-onto-vector) – Abbath
Bkz. ['Tuple'] (http://www.cplusplus.com/reference/tuple /), belki. Vektörler (aka listeleri) bir veya daha fazla * homojen * öğe dizisidir. Tupllar, olası heterojen üyelerin sonlu (ve sabit büyüklükte) koleksiyonlarıdır. – user2864740
Öğeleri her birinin 3 türünü içeren bir vektörün olmasını ister misiniz? Ya da tek tip veya diğerleri içerebilir bir vektör? – Galik