Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++_Heap Memory_Stack Memory - Fatal编程技术网

C++ 抽象类的堆分配

C++ 抽象类的堆分配,c++,heap-memory,stack-memory,C++,Heap Memory,Stack Memory,我想知道为什么我不能将抽象对象数组初始化到堆栈而不是堆 这里有一些类似于我的C++代码,在最后一行中失败了。我主要只是好奇这个问题背后的原因是如何处理堆还是堆栈。提前谢谢 #define ARRAY_SIZE 10 class Obj { public: virtual void fn() =0; }; class Sub : public Obj { public: void fn() { // ... } }; Obj * o1_array[AR

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

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

你在做两件截然不同的事情。在“堆栈”的情况下

您正在初始化指针数组。您不需要完整或非抽象类型。在“堆”的情况下

您正在初始化RHS上的对象数组,并将第一个元素的地址分配给LHS中的指针。您需要一个完整的非抽象类型来构建数组。如果您想要一个动态大小的指针集合,最好使用一个指针容器(假设其他东西负责管理指针对象的生命周期)或一个智能指针容器(指针的智能性决定谁管理指针对象)

非管理:

std::vector<Obj*> o1_array(ARRAY_SIZE);
std::向量o1_数组(数组大小);
管理(唯一所有权):

std::向量o1_数组(数组大小);

有关容器管理“指针”的更多选项,请参阅。

您正在做两件截然不同的事情。在“堆栈”的情况下

您正在初始化指针数组。您不需要完整或非抽象类型。在“堆”的情况下

您正在初始化RHS上的对象数组,并将第一个元素的地址分配给LHS中的指针。您需要一个完整的非抽象类型来构建数组。如果您想要一个动态大小的指针集合,最好使用一个指针容器(假设其他东西负责管理指针对象的生命周期)或一个智能指针容器(指针的智能性决定谁管理指针对象)

非管理:

std::vector<Obj*> o1_array(ARRAY_SIZE);
std::向量o1_数组(数组大小);
管理(唯一所有权):

std::向量o1_数组(数组大小);

有关容器管理“指针”的更多选项,请参阅。

是否有任何方法可以动态定义数组并仍然能够使用抽象类,这样我就可以通过多态方式循环数组并仍然能够更改其大小?@Cameron当然,您可以实例化指针数组(或容器)。我将添加一个示例。那么,有没有办法动态定义数组,并且仍然能够使用抽象类,这样我就可以在数组中进行多态循环,并且仍然能够更改其大小?@Cameron当然,您可以实例化指针数组(或容器)。我将添加一个示例。
std::vector<Obj*> o1_array(ARRAY_SIZE);
std::vector<std::unique_ptr<Obj>> o1_array(ARRAY_SIZE);