我需要创建一个包含多个类对象的数组。
实施例
class baseClass
{
//
};
class first : baseClass
{
//
};
class second : baseClass
{
//
};
如何创建可以在其中包含first
和/或second
对象的数组?
这对我来说有点像家庭任务所以我被迫使用数组,我已经搜索并知道它已经完成了升级库这样但我在这里没有选择......
答案 0 :(得分:6)
最好的做法是在基类中创建一个智能指针数组 - 最好是Boost或C ++ 11版本之一。使其成为指针数组可以消除在访问对象时“切片”对象的风险。使用智能指针可降低内存泄漏的风险。使它成为基类指针意味着可以安全地将派生类存储在那里。
答案 1 :(得分:2)
如果你不能使用库,你需要一个指针数组,如:
baseClass *array[123];
array[0] = new first();
array[1] = new second();
并且不会发生切片。 (别忘了delete
一切)
答案 2 :(得分:2)
baseClass *array[10];
baseClass **array2 = new baseClass *[size];
这是最简单,最危险的方式。您必须小心对象的生命周期,以避免泄漏或双重释放。您还必须小心数组的分配和释放,特别是如果您必须在运行时更改大小。
std::vector<baseClass*> vec;
这改进了前面的例子,因为向量为你处理数组的内存,但你仍然要小心使用baseClass指针。
std::vector<boost::variant<first,second> > vec2;
这是另一项改进,它消除了为对象手动分配或释放内存的需要,并且在以第一或第二次访问对象方面类型安全。你不能把一种对象误认为另一种。
std::vector<std::unique_ptr<baseClass>> vec3;
使用此选项,您仍然可以将不同类型的对象相互混淆,但它仅使用标准库,您仍然无需管理所分配对象的生命周期。它确实使用C ++ 11。
此外,如果您不需要动态数组,则可以使用std::array<...,size>
std::array<std::unique_ptr<baseClass>,10> array3;
在运行时baseClass *array[10];
上的空间或时间开销绝对为零,并且更加安全。 (零开销,假设一个不错的实现)