C++创建不同类的对象数组

7
我需要创建一个包含来自多个类的对象的数组。
示例:
class baseClass
{
   //
};

class first : baseClass
{
   //
};

class second : baseClass
{
   //
};

我如何创建一个可以容纳first和/或second对象的数组?

这对我来说有点像家庭作业,所以我被迫使用数组。我已经搜索过并知道可以使用boost库等方式实现,但是在这里我没有其他选择...


类似:http://stackoverflow.com/questions/7018183/provide-array-of-derived-objects-to-function-that-operates-on-base-objects - tinman
3个回答

6

最好的实践是创建一个指向基类的智能指针数组-最好是Boost或C++11版本之一。将其设置为指针数组可以消除访问对象时“切片”的风险。使用智能指针可以减少内存泄漏的风险。将其设置为基类指针意味着任何派生类都可以安全地存储在其中。


3
baseClass *array[10];
baseClass **array2 = new baseClass *[size];

这是最简单但也最危险的方法。为了避免内存泄漏或重复释放,您必须注意对象的生命周期。您还必须小心数组的分配和释放,特别是在运行时需要更改大小的情况下。

std::vector<baseClass*> vec;

这个例子比之前的更好,因为向量会为您处理数组的内存,但您仍然需要小心处理基类指针。

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];相比完全没有空间或时间开销,并且更安全。(零开销,假设有一个良好的实现)

2

如果您无法使用库,您需要一个指针数组,如下所示:

baseClass *array[123];
array[0] = new first();
array[1] = new second();

不会发生任何切片。 (不要忘记删除所有内容)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接