将指针转换为shared_ptr

时间:2009-05-20 12:02:31

标签: c++ pointers

我有一些库代码(我不能更改源代码)返回指向对象的指针(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),我仍然有一个精确的副本)。

我是新手,对不起,如果它看起来微不足道......

3 个答案:

答案 0 :(得分:2)

如果库定义了这个B对象,那么库应该提供(或彻底禁止)复制B的机制。

作为旁注,

如果您的A类专门控制此复制对象的生命周期,那么您真正想要使用的智能指针是boost::scoped_ptr

boost::shared_ptr以其分担终身责任的能力命名,这听起来像你不想要的。 scoped_ptr不会让这种情况意外发生。

答案 1 :(得分: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;
   ...
}

答案 2 :(得分:1)

复制构造函数在C ++中简单地实现深度复制,因为在C ++中,所有对象默认都具有值语义。以这种方式复制不适用于多态对象 - 在这种情况下,您必须在类中实现一个实际重写的clone方法。

但在所有其他情况下,只需写

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

会做的。