抽象的堆分配 class
Heap allocation of abstract class
我想知道为什么我不能将抽象对象数组初始化到堆栈而不是堆。
这是一些与我的代码类似的 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
你在做两件截然不同的事情。在 "stack" 的情况下,
Obj * o1_array[ARRAY_SIZE];
您正在初始化一个 指针数组 。为此,您不需要完整或非抽象类型。在"heap"的情况下,
Obj * o2_array = new Obj[ARRAY_SIZE];
您正在初始化 RHS 上的 objects 数组,并将第一个元素的地址分配给 LHS 中的指针。您需要一个完整的非抽象类型来构建数组。如果你想要一个动态大小的指针集合,一个好的选择是使用一个指针容器(假设其他东西负责管理指针的生命周期)或一个智能指针容器(指针的智能决定)谁管理指针)。
非管理人员:
std::vector<Obj*> o1_array(ARRAY_SIZE);
管理(唯一所有权):
std::vector<std::unique_ptr<Obj>> o1_array(ARRAY_SIZE);
有关容器管理 "pointers" 的更多选项,请参阅 boost pointer container library。
我想知道为什么我不能将抽象对象数组初始化到堆栈而不是堆。
这是一些与我的代码类似的 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
你在做两件截然不同的事情。在 "stack" 的情况下,
Obj * o1_array[ARRAY_SIZE];
您正在初始化一个 指针数组 。为此,您不需要完整或非抽象类型。在"heap"的情况下,
Obj * o2_array = new Obj[ARRAY_SIZE];
您正在初始化 RHS 上的 objects 数组,并将第一个元素的地址分配给 LHS 中的指针。您需要一个完整的非抽象类型来构建数组。如果你想要一个动态大小的指针集合,一个好的选择是使用一个指针容器(假设其他东西负责管理指针的生命周期)或一个智能指针容器(指针的智能决定)谁管理指针)。
非管理人员:
std::vector<Obj*> o1_array(ARRAY_SIZE);
管理(唯一所有权):
std::vector<std::unique_ptr<Obj>> o1_array(ARRAY_SIZE);
有关容器管理 "pointers" 的更多选项,请参阅 boost pointer container library。