Вот что я имею:
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>
s.
Я попробовал это:
B::B():_v(2, boost::make_shared<A>(0)){}
Но кажется, что оба указателя указывают на единственный созданный объект - не то, что мне нужно.
У меня нет c++11
поэтому я не могу использовать:
B::B():_v{boost::make_shared<A>(0), boost::make_shared<A>(0)}{}
Какое наилучшее решение для этой ситуации?
Переместите создание vector
в функцию, которая возвращает vector
.
Стоимость копирования vector
shared_ptr
с двумя элементами будет достаточно низкой, чтобы вам было все равно, и с NRVO и RVO она может быть полностью оптимизирована даже в С++ 03. (В С++ 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() ) {}