我有一个对象,它同时定义了复制构造函数和赋值运算符。它包含在共享指针内。
我想创建另一个共享指针,其中包含原始共享指针的副本(即指向新内存位置的新共享指针,但该数据库与原始对象具有相同的数据)。
感谢您的帮助。
答案 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();