2010-07-15 57 views
8

我有一个类的范围指针的数组没有一个默认的构造函数。正确初始化boost :: scoped_ptr数组的方法?

我发现“初始化”他们正在使用swap()这样的唯一方法:

class Bar { 
    Bar(char * message) {}; 
} 

class Foo 
{ 
    boost::scoped_ptr<Bar> arr[2]; 

    Foo() 
    { 
    arr[0].swap(boost::scoped_ptr<Bar>(new Bar("ABC"))); 
    arr[1].swap(boost::scoped_ptr<Bar>(new Bar("DEF"))); 
    }; 
} 

这感觉有点冗长和沉闷。我错过了更聪明的方式吗?

回答

15
arr[0].reset(new Bar("ABC")); 
arr[1].reset(new Bar("DEF")); 
+0

正如预期的那样,我错过了显而易见的方式。谢谢! – Roddy 2010-07-15 18:58:44

+0

谢谢!我不敢相信我忽略了这一点。 – Vortico 2012-05-10 23:20:38

1

如何使用typedef?

typedef boost::scoped_ptr<Bar> TBarPtr; 
arr[0].swap(TBarPtr(new Bar("ABC")); 
5

最大的问题是没有办法在这里使用成员初始值设定项列表初始化数组。 您可能需要使用专门的指针容器像ptr_vector代替:

struct Foo { 
    boost::ptr_vector<Bar> bars;  
    X() : bars(boost::assign::ptr_list_of<Bar>("ABC")("CDE")) {} 
}; 
1

一个解决方案:使用boost::ptr_vector而不是数组。

您还可以使用 std::vector<scoped_ptr>并使用 push_back填充阵列。 编辑:我认为这不适用于scoped_ptr。