我想知道为什么我不能将一个抽象对象数组初始化到堆栈而不是堆.
这里有一些类似于我的C++代码在最后一行失败了.我主要只是对处理堆与堆栈的问题背后的原因感到好奇.提前致谢!
#define ARRAY_SIZE 10
class Obj {
public:
virtual void fn() =0;
};
class Sub : public Obj {
public:
void fn() {
// ...
}
};
Obj * o1_array[ARRAY_SIZE];
Obj * o2_array = new Obj[ARRAY_SIZE]; // Compiler Error
Run Code Online (Sandbox Code Playgroud)
你正在做两件截然不同的事情.在"堆栈"的情况下,
Obj * o1_array[ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)
你正在初始化一个指针数组.您不需要完整或非抽象类型.在"堆"的情况下,
Obj * o2_array = new Obj[ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)
您正在初始化RHS上的对象数组,并将第一个元素的地址分配给LHS中的指针.您需要一个完整的非抽象类型来构建数组.如果你想要一个动态大小的指针集合,一个好的选择是使用一个指针容器(假设其他人负责管理pointees的生命周期)或智能指针的容器(指针的智能决定)管理指针的人.
非管理:
std::vector<Obj*> o1_array(ARRAY_SIZE);
Run Code Online (Sandbox Code Playgroud)
管理(独特所有权):
std::vector<std::unique_ptr<Obj>> o1_array(ARRAY_SIZE);
Run Code Online (Sandbox Code Playgroud)
有关管理"指针"的容器的更多选项,请参阅boost指针容器库.