C++创建对象数组(来自不同的类)

Sta*_*tan 6 c++ class

我需要创建一个包含多个类对象的数组.

class baseClass
{
   //
};

class first : baseClass
{
   //
};

class second : baseClass
{
   //
};
Run Code Online (Sandbox Code Playgroud)

如何创建可以在其中保存first和/或second对象的数组?

这对我来说有点像家庭任务,所以我被迫使用数组,我已经搜索并知道它是用升级库来完成的,但我在这里没有选择......

Har*_*lby 6

最好的做法是创建一个智能指针数组 - 最好是Boost或C++ 11版本之一 - 到基类.使其成为指针数组可以消除在访问对象时"切片"对象的风险.使用智能指针可降低内存泄漏的风险.使其成为基类指针意味着可以安全地将派生类存储在那里.


bam*_*s53 3

baseClass *array[10];
baseClass **array2 = new baseClass *[size];
Run Code Online (Sandbox Code Playgroud)

这是最简单也是最危险的方法。您必须小心对象的生命周期,以避免泄漏或双重释放。您还必须小心数组的分配和释放,特别是当您必须在运行时更改大小时。

std::vector<baseClass*> vec;
Run Code Online (Sandbox Code Playgroud)

这改进了前面的示例,因为向量为您处理数组的内存,但您仍然必须小心使用基类指针。

std::vector<boost::variant<first,second> > vec2;
Run Code Online (Sandbox Code Playgroud)

这是另一项改进,消除了为对象手动分配或释放内存的需要,并且在第一或第二次访问对象方面是类型安全的。你不能将一种物体误认为是另一种物体。

std::vector<std::unique_ptr<baseClass>> vec3;
Run Code Online (Sandbox Code Playgroud)

使用此选项,您仍然可以混淆不同类型的对象,但它仅使用标准库,并且您仍然不必管理分配的对象的生命周期。但它确实使用了 C++11。

另外,如果您不需要动态数组,您可以使用std::array<...,size>

std::array<std::unique_ptr<baseClass>,10> array3;运行时的空间或时间开销绝对为零baseClass *array[10];,并且更安全。(零开销,假设实现得当)