У меня есть класс с массивом ограниченных по объему указателей на объекты, которые НЕ имеют конструктора по умолчанию.
Единственным путем я нашел для "инициализирования" их, использует 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") ));
};
}
Это чувствует себя немного подробным и неуклюжим. Я пропустил более умный способ сделать его?
arr[0].reset(new Bar("ABC"));
arr[1].reset(new Bar("DEF"));
Как насчет использования typedef?
typedef boost::scoped_ptr<Bar> TBarPtr;
arr[0].swap(TBarPtr(new Bar("ABC"));
Самая большая проблема заключается в том, что здесь нет способа инициализировать массив, используя список инициализаторов элементов.
Вместо этого вы можете использовать специализированный контейнер указателей, например ptr_vector
:
struct Foo {
boost::ptr_vector<Bar> bars;
X() : bars(boost::assign::ptr_list_of<Bar>("ABC")("CDE")) {}
};
Одно решение: используйте boost :: ptr_vector вместо массива .
Вы также можете использовать Изменить: я думаю, что это не сработает с scoped_ptr. std :: vector
и заполнить массив с помощью push_back
.