堆配置抽象类

Cam*_*ron 0 c++ heap stack

我想知道为什么我不能将一个抽象对象数组初始化到堆栈而不是堆.

这里有一些类似于我的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)

jua*_*nza 6

你正在做两件截然不同的事情.在"堆栈"的情况下,

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指针容器库.