2013-10-09 55 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()) {}