2013-10-09 56 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; 
} 

我需要有兩個boost::shared_ptr<A> s到初始化_v

我嘗試這樣做:

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))){}'不幸的是,據報道這是不明確的('v'的ctor;我不知道爲什麼)由醜陋的S():v(vector >()= list_of(make_shared (0))(make_shared (1))){} – dyp

回答

2

將創建vector移動到返回vector的函數中。

使用2個元素複製vector,shared_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()) {}