Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抽象类的动态数组_C++_Arrays_Abstract Class - Fatal编程技术网

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