2013-11-21 73 views
1

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

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

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

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

这是给我的,当我尝试编译下面?

回答

2

在同一行并且不会像&SubClass1(...),那样执行临时的地址。东西,如:

BaseClass *array [] = { new SubClass(...), new SubClass2(...), .... }; 

但是这样的设计味道有点像不知道如何做一个factory

因为您没有使用std::shared_ptrstd::unique_ptr来管理您的指针,请不要忘记delete他们! (谢谢@dasblinkenlight)

+0

我试过这个,但它给了我“错误:'BaseClass * [0]'”的初始化器过多。 – PandaConda

+0

我刚刚在g ++ 4.8下测试了一个类似的东西,并且没有错误... http://ideone.com/phWplC – Johan

+0

不幸的是我被gcc 4.4.7卡住了。这可能是为什么它不工作? – PandaConda

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) 
}; 
+0

我不认为'std :: unique_ptr'会很好,如果它是一种工厂设计,因为你不能复制它们......但是如果它只是用于访问,那将起作用。 – Johan

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>(...) 
}; 
+0

'std :: make_shared (...)'甚至会更好! – Johan

+0

@Johan这是真的,谢谢!这现在已经修复。 – dasblinkenlight

+0

谢谢。我会尝试这种方法。那么如果没有将每个(指向每个对象的)对象存储在数组之外的单独变量中,没有办法做到这一点?我希望能够编辑此数组的内容,以便更改其内容,而无需修改任何内容。 – PandaConda