抽象的堆分配 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