2009-05-20 119 views
1

我有一些库代码(我不能改变源代码),它返回一个指向对象(B)的指针。我想这个指针的shared_ptr类下存储与这种类型的构造:convert pointer to shared_ptr

class A 
{ 
    public: 
    A(boost::shared_ptr<B> val); 
    ... 
    private: 
    boost::shared_ptr<B> _val; 
    ... 
}; 

int main() 
{ 
    B *b = SomeLib(); 
    A a(b); //?? 
    delete b; 
    ... 
} 

也就是说,我想提出的B A深拷贝和下控制其生命时间(即使原始b被删除(删除b),我仍然在a)下有一个确切的副本。

我是新来这个,如果它似乎对不起微不足道......

回答

2

就像你说的,你必须复制他们不只是复制一个指针。所以要么B已经实现了'clone'方法,要么你必须实现一些外部的B* copy(B* b),这将创建具有相同状态的新B。

如果B已实现的拷贝构造函数可以实现副本只是

B* copyOf(B* b) 
{ 
    return new B(*b); 
} 

如果B已实现clone method or similar可以实现副本

B* copyOf(B* b) 
{ 
    return b->clone(); 
} 

,然后你的代码看起来像

int main() 
{ 
    B *b = SomeLib(); 
    A a(copyOf(b)); 
    delete b; 
    ... 
} 
+0

我没有看到使用函数`copy` ... – 2009-05-20 12:12:07

+0

在主函数的第二行。 – 2009-05-20 12:15:23

+0

@Mykola:我明白了 - 但我不明白这一点:它毫无意义。抱歉。 – 2009-05-20 13:59:26

1

深拷贝在C++中实现很普通通过自C++以来的拷贝构造函数,所有对象默认具有值语义。虽然以这种方式进行复制对于多态对象不起作用 - 在这种情况下,您必须在类中实现一个几乎覆盖的clone方法。

但在其他情况下,简单地写

A(boost::shared_ptr<B> val) : _val(new B(*val)) { } 

会做。

2

如果库定义了该B对象,图书馆应用于复制B.

作为旁注提供(或完全禁止)的机构,

如果类A被排他地控制这个寿命复制的对象,你真正想使用的智能指针是boost::scoped_ptr

boost::shared_ptr以其共享生命责任的能力命名,这听起来像你不想要的。 scoped_ptr不会让这个意外发生。