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

8

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

我找到的唯一初始化它们的方法是使用 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个回答

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

正如所料,我错过了显而易见的方法。谢谢! - Roddy
谢谢!我简直不敢相信我竟然忽略了这个。 - Vortico

5

最大的问题是在这里没有办法使用成员初始化列表来初始化数组。 你可能想要使用一个专门的指针容器,比如ptr_vector

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

1

使用typedef怎么样?

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

1
一个解决方案:使用 boost::ptr_vector 而不是数组。 你也可以使用 std::vector<scoped_ptr> 并使用 push_back 填充数组。 编辑:我认为这不适用于 scoped_ptr。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接