如何在c ++中创建包含在共享指针中的对象的重复实例?

时间:2010-06-16 02:39:43

标签: c++ shared-ptr smart-pointers

我有一个对象,它同时定义了复制构造函数和赋值运算符。它包含在共享指针内。

我想创建另一个共享指针,其中包含原始共享指针的副本(即指向新内存位置的新共享指针,但该数据库与原始对象具有相同的数据)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:10)

在创建新对象时调用复制构造函数:

std::shared_ptr<C> ptr1(new C());      // invokes the default constructor
std::shared_ptr<C> ptr2(new C(*ptr1)); // invokes the copy constructor

在这种情况下,它与你有常规的,愚蠢的指针没什么不同。

答案 1 :(得分:1)

我常常会使用带有多态类型的共享指针。在这种情况下,您无法使用James McNellis建议的方法。

class Base
{
 ...
  virtual void doSomething()=0;
};

class Derived : public Base
{
  ...
  void doSomething() { ... }
};

std::shared_ptr<Base> ptr(new Derived);
std::shared_ptr<Base> cpy( new Base( *ptr ) ); // THIS DOES NOT COMPILE!

所以我做的是将克隆函数添加到基类中,并在派生类中实现它。

class Base
{
 ...
  virtual void doSomething()=0;
  virtual std::shared_ptr<Base> clone() const =0;
};

class Derived : public Base
{
  ...
  void doSomething() { ... }
  std::shared_ptr<Base> clone() const 
  { 
     return std::shared_ptr<Base>( new Derived( *this ) );
  }
};


std::shared_ptr<Base> ptr(new Derived);
std::shared_ptr<Base> cpy = ptr->clone();