Правильный способ инициализации массива boost :: scoped_ptr? - PullRequest
8 голосов
/ 15 июля 2010

У меня есть класс с массивом указателей на объекты для объектов, которые НЕ имеют конструктора по умолчанию.

Единственный способ, которым я нашел, чтобы "инициализировать" их, это использовать 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 голосов
/ 15 июля 2010
arr[0].reset(new Bar("ABC"));
arr[1].reset(new Bar("DEF"));
5 голосов
/ 15 июля 2010

Самая большая проблема в том, что здесь нет способа инициализировать массив с использованием списка инициализаторов членов. Возможно, вы захотите использовать специальный контейнер указателей, например ptr_vector вместо:

struct Foo {
    boost::ptr_vector<Bar> bars;    
    X() : bars(boost::assign::ptr_list_of<Bar>("ABC")("CDE")) {}
};
1 голос
/ 15 июля 2010

Одно решение: используйте boost :: ptr_vector вместо массива.

Вы также можете использовать std::vector<scoped_ptr> и заполнить массив, используя push_back. Изменить: я думаю, что это не будет работать с scoped_ptr.

1 голос
/ 15 июля 2010

Как насчет использования typedef?

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