c ++: инициализировать вектор shared_ptr в конструкторе как разные указатели

0

Вот что я имею:

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
shared-ptr

1 ответ

2
Лучший ответ

Переместите создание 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() ) {}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню