我有一些库代码(我不能更改源代码)返回指向对象的指针(B)。我想将此指针存储为具有此类构造函数的类下的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的深层副本并控制它的生命时间(即使原来的b被删除(删除b),我仍然有一个精确的副本)。
我是新手,对不起,如果它看起来微不足道......
答案 0 :(得分:2)
正如你所说,你必须复制它们而不仅仅是复制指针。所以要么B已经实现了'克隆'方法,要么你必须实现一些外部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;
...
}
答案 1 :(得分:2)
如果库定义了这个B对象,那么库应该提供(或彻底禁止)复制B的机制。
作为旁注,
如果您的A类专门控制此复制对象的生命周期,那么您真正想要使用的智能指针是boost::scoped_ptr
。
boost::shared_ptr
以其分担终身责任的能力命名,这听起来像你不想要的。 scoped_ptr
不会让这种情况意外发生。
答案 2 :(得分:1)
复制构造函数在C ++中简单地实现深度复制,因为在C ++中,所有对象默认都具有值语义。以这种方式复制不适用于多态对象 - 在这种情况下,您必须在类中实现一个实际重写的clone
方法。
但在所有其他情况下,只需写
A(boost::shared_ptr<B> val) : _val(new B(*val)) { }
会做的。