我在C ++中有一个抽象基类,需要创建一个数组来存储作为它的子类的对象。我使用指向子类的指针,因为数组的每个成员都需要具有相同的大小。目前我正在声明并初始化我的数组:
BaseClass *array[];
...
array =
{
&SubClass1(...),
&SubClass2(...),
...
&SubClass3(...)
};
当我尝试编译时,这给了我以下内容:
warning: taking address of temporary
error: too many initializers for ‘BaseClass* [0]’
这样做的正确方法是什么?
答案 0 :(得分:3)
您无法使用临时工具 - 您应该静态地,动态地分配对象,或将它们放在自动存储中。
要静态分配对象,请执行以下操作:
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>(...)
};
答案 1 :(得分:2)
在&SubClass1(...),
上的同一行和没有采用临时的地址。东西,比如:
BaseClass *array [] = { new SubClass(...), new SubClass2(...), .... };
但这种设计有点像不知道如何做factory。
由于您没有使用std::shared_ptr
或std::unique_ptr
管理指针,请不要忘记delete
他们! (感谢@dasblinkenlight)
答案 2 :(得分:1)
那些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)
};