在C++中初始化抽象基类的子类数组
Initializing array of subclasses of abstract base class in C++
我在C++中有一个抽象基类,需要创建一个数组来存储作为其子类的对象。我使用指向子类的指针,因为数组的每个成员都需要具有相同的大小。目前我正在声明和初始化我的数组,如下所示:
BaseClass *array[];
...
array =
{
&SubClass1(...),
&SubClass2(...),
...
&SubClass3(...)
};
当我尝试编译时,这给了我以下信息:
warning: taking address of temporary
error: too many initializers for ‘BaseClass* [0]’
做这件事的正确方法是什么?
您不能用临时存储来实现这一点——您应该静态、动态地分配对象,或者将它们放入自动存储中。
要静态分配对象,请执行以下操作:
static SubClass1 s1(..);
static SubClass2 s2(..);
static SubClass3 s3(..);
BaseClass *array [] = { &s1, &s2, &s3 };
如果您动态分配它们,请考虑使用vector<shared_ptr<T>>
而不是"原始"指针来自动解除分配:
vector<shared_ptr<BaseClass>> data = {
make_shared<SubClass1>(...)
, make_shared<SubClass2>(...)
, make_shared<SubClass3>(...)
};
在同一行,并且不像在&SubClass1(...),
中那样使用临时的地址。比如:
BaseClass *array [] = { new SubClass(...), new SubClass2(...), .... };
但这种设计闻起来有点像不知道如何做工厂。
由于您没有使用std::shared_ptr
或std::unique_ptr
来管理指针,请不要忘记delete
它们!(感谢@dasblinkenlight)
那些SubClass1(...)
是临时对象,如果控件超出范围,它们将被销毁,并且array
的所有指针都将是指向无效地址的悬挂指针。
您可以在array
的作用域中创建这些对象,以确保这些对象和该数组具有相同的生存期:
SubClass1 class1 (...);
SubClass2 class2 (...);
SubClass3 class3 (...);
BaseClass *array[] =
{
&class1(...),
&class2(...),
...
};
也可以使用智能指针:
std::unique_ptr<BaseClass> array[] =
{
std::unique_ptr<BaseClass>(new SubClass1),
std::unique_ptr<BaseClass>(new SubClass2)
};
相关文章:
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 类数组插入函数
- C++访问指向结构的指针中的类数组指针
- 类数组正在损坏数据
- 如何在 turbo C++ 中增加类数组的大小?
- 如何初始化文件中的文本并将其传递给类数组,以便在c++中输出
- 从基类数组调用派生函数
- lower_bound结构节点的类数组中
- 在构造函数中使用参数创建一个类数组
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 如何将字符串片段读入类数组C++
- 如果类数组中的向量是动态push_backed的,内存如何工作
- C 类数组的Kotlin等效
- 指针算术,带有指向类数组的指针
- 具有多种类型的类数组?如何访问数组中的一个类型
- 尝试在类数组上使用成员函数
- 在C++中初始化抽象基类的子类数组
- 在c++中从超类数组中访问子类方法
- 调用一个方法在C多个类数组的子,执行父一个