在C ++中初始化抽象基类的子类数组

时间:2013-11-21 17:28:57

标签: c++ arrays pointers inheritance abstract-class

我在C ++中有一个抽象基类,需要创建一个数组来存储作为它的子类的对象。我使用指向子类的指针,因为数组的每个成员都需要具有相同的大小。目前我正在声明并初始化我的数组:

BaseClass *array[];
...
array =
{
    &SubClass1(...),
    &SubClass2(...),
    ...
    &SubClass3(...)
};

当我尝试编译时,这给了我以下内容:

warning: taking address of temporary
error: too many initializers for ‘BaseClass* [0]’

这样做的正确方法是什么?

3 个答案:

答案 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_ptrstd::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)
};