C++ 抽象类的动态数组
我有一个名为C++ 抽象类的动态数组,c++,arrays,abstract-class,C++,Arrays,Abstract Class,我有一个名为CBase的抽象基类和另外两个从CBase派生的类CDerived1和CDerived2 现在如何创建CBase的动态数组(即在运行时添加和删除元素)?当然,这个数组只包含派生类的对象,因为基类是抽象的 我想试试这样的东西: CBase* arr; arr = (CBase*) malloc(arrSize*sizeof(CBase)); 当我想要调整数组的大小时,感觉这个解决方案会变得复杂。我该怎么做?或者您建议使用其他类型的数组吗?您正在分配一个包含CBase对象的数组,因此当
CBase
的抽象基类和另外两个从CBase
派生的类CDerived1
和CDerived2
现在如何创建CBase
的动态数组(即在运行时添加和删除元素)?当然,这个数组只包含派生类的对象,因为基类是抽象的
我想试试这样的东西:
CBase* arr;
arr = (CBase*) malloc(arrSize*sizeof(CBase));
当我想要调整数组的大小时,感觉这个解决方案会变得复杂。我该怎么做?或者您建议使用其他类型的数组吗?您正在分配一个包含
CBase
对象的数组,因此当您尝试将派生对象分配给数组元素时,它会受到影响。您真正需要的是一个CBase*
指针数组:
CBase**arr;
arr=新的CBase*[arrSize];
arr[0]=新CDerived1;
...
对于(int i=0;i
也就是说,您确实应该使用std::vector
而不是new[]
,并且在C++11及更高版本中,更喜欢std::unique\u ptr
而不是原始指针:
#包括
#包括
std::载体arr;
arr.reserve(arrSize);
arr.push_-back(标准::unique_-ptr(新CDerived1));
//或者,在C++14及更高版本中:
//arr.push_back(std::make_unique());
...
//无需手动清理!
(a)现代C++中的动态内存管理=可怕的想法。(b) 使用malloc
来实现(a)更糟糕的想法。使用一个合适的智能指针容器。这有很多错误。我强烈建议你买一本并仔细阅读。1)你正在使用malloc
,而new
要好得多(malloc不叫c'tor)。2) 当标准容器或unique\ptr
更好时,您使用的是手动内存管理。3)您不能拥有多态对象数组。这将导致对象切片。你需要另一个间接层次。我相信你应该使用的工具是vector
。