Корректный способ инициализировать массив повышения:: 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") ));
  };
}

Это чувствует себя немного подробным и неуклюжим. Я пропустил более умный способ сделать его?

8
задан BlueRaja - Danny Pflughoeft 15 July 2010 в 16:36
поделиться

4 ответа

arr[0].reset(new Bar("ABC"));
arr[1].reset(new Bar("DEF"));
15
ответ дан 5 December 2019 в 07:33
поделиться

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

typedef boost::scoped_ptr<Bar> TBarPtr;
arr[0].swap(TBarPtr(new Bar("ABC"));
1
ответ дан 5 December 2019 в 07:33
поделиться

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

struct Foo {
    boost::ptr_vector<Bar> bars;    
    X() : bars(boost::assign::ptr_list_of<Bar>("ABC")("CDE")) {}
};
5
ответ дан 5 December 2019 в 07:33
поделиться

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

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

1
ответ дан 5 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: