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

时间:2011-10-24 15:26:02

标签: c++ class

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

实施例

class baseClass
{
   //
};

class first : baseClass
{
   //
};

class second : baseClass
{
   //
};

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

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

3 个答案:

答案 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];上的空间或时间开销绝对为零,并且更加安全。 (零开销,假设一个不错的实现)