2013-10-09 5 views
0

Вот что у меня есть:C++: Инициализировать вектор shared_ptr в конструкторе, как различные указатели

class A 
{ 
    A(int i):_i(i){} 

private: 
    int _i; 
}; 

class B 
{ 
    B(); 

private: 
    std::vector< boost::shared_ptr<A> > _v; 
} 

И мне нужно инициализировать _v с двумя boost::shared_ptr<A> с.

Я попытался это:

B::B():_v(2, boost::make_shared<A>(0)){} 

Но, похоже, что и точка указатель на единственный созданный объект - не то, что мне нужно.

Я не c++11, так что я не могу использовать:

B::B():_v{boost::make_shared<A>(0), boost::make_shared<A>(0)}{} 

Что является лучшим решением для этой ситуации?

+1

Не можете ли вы просто «push_back» дважды? – mfontanini

+0

'B :: B(): _v (2) {_v [0] = boost :: make_shared (0); _v [1] = boost :: make_shared (0); } ' – john

+0

Вы можете использовать' boost :: assign :: list_of', например. 'S(): v (list_of (make_shared (0)) (make_shared (1))) {}' к сожалению, это, как сообщается, неоднозначно (ctor 'v'; я не знаю почему) и может (make_shared (0)) (make_shared (1))) {} ' – dyp

ответ

2

Переместить создание vector в функцию, которая возвращает vector.

Стоимость копирования vectorshared_ptr с двумя элементами будет достаточно низкой, чтобы вам было все равно, и с NRVO и RVO она может быть полностью оптимизирована даже в C++ 03. (В C++ 11, если NRVO и RVO заблокированы по какой-либо причине, будут выполняться только движения).

// if you make it a member, make it `static`: 
std::vector<boost::shared_ptr<A> > make_vector() { 
    std::vector<boost::shared_ptr<A> > retval; 
    retval.push_back(boost::make_shared<A>(0)); 
    retval.push_back(boost::make_shared<A>(0)); 
    return retval; 
} 
B::B():_v(make_vector()) {} 
Смежные вопросы