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);