2010-07-15 3 views
8

У меня есть класс с массивом облачных указателей на объекты, которые НЕ имеют конструктор по умолчанию.Правильный способ инициализации массива boost :: 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"))); 
    }; 
} 

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

ответ

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

Как и ожидалось, я пропустил очевидный путь. Благодаря! – Roddy

+0

Спасибо! Не могу поверить, что я не обратил на это внимания. – Vortico

1

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

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

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

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

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

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

Смежные вопросы