正确初始化boost :: scoped_ptr数组的方法?

时间:2010-07-15 16:25:49

标签: c++ boost smart-pointers

我有一个类,其中包含一个指向没有默认构造函数的对象的作用域指针数组。

我发现“初始化”它们的唯一方法就是使用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") ));
  };
}

这感觉有点冗长和笨重。我错过了一种更聪明的方法吗?

4 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:5)

最大的问题是没有办法在这里使用成员初始化列表初始化数组。 您可能希望使用类似ptr_vector的专用指针容器:

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

答案 2 :(得分:1)

使用typedef怎么样?

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

答案 3 :(得分:1)

一种解决方案:使用boost::ptr_vector代替数组。

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