在自己内部归还自己的副本的正确方法是什么?

时间:2013-05-17 15:02:50

标签: c++ c++11

Node*Clone(){
    numClones++;    
    Node*cloned=new Node(*this);
    return cloned;
}

我有一个默认的构造函数(不带参数),我没有声明的复制构造函数,所以我希望这只是简单地复制*this内存的全部内容并返回指向它的指针。 / p>

但是,我在上面的new行收到错误:

Call to implicitly deleted copy constructor

两个可能的问题,但我认为它们不应该影响这个:

  • this附加了unique_ptr。也就是说,它包含unique_ptr的容器,并且本身存储在unique_ptr的另一个容器中。但我没有移动那个指针,我创建的new对象没有附加到前一个对象,对吗?
  • this实际上是Node的子类,但我想返回一个指向基类的指针

4 个答案:

答案 0 :(得分:2)

正如杰弗里所说,std::unique_ptr不能复制。

您的Clone方法在逻辑上也不正确。因为你在那里实例化一个Node对象 - 一个基类。所以它实际上不是副本

作为一种解决方案,您可以在基类中声明一个Clone方法并使其成为纯虚拟:

class Node
{
    virtual Node * Clone() const = 0;
}

让你的子类实现它

PS:不要忘记界面中的virtualprotected dtor

答案 1 :(得分:1)

错误消息“调用隐式删除的复制构造函数”意味着您的类,其基类之一和/或该类或其任何基类的某些数据成员被声明为不可复制(或者是被编译器视为不可复制的,例如,当至少一个数据成员是reference时,可能会发生这种情况。因此,编译器无法提供您尝试使用new Node(*this);

调用的“默认”复制构造函数

在这种情况下,正确的方法是实际找到哪些对象完全是不可复制的,并使它们可复制,以便编译器可以创建一个隐式定义的复制构造函数,或者实现你自己的“复制逻辑”而不是使用复制构造函数。

另一种选择是使用某种“智能”指针指针(即std::shared_ptr)。但在这种情况下,您会获得shallow copy而不是deep copy

答案 2 :(得分:0)

由于您正在复制自己,我建议您实现一个复制构造函数。这是控制的最佳实践,另外如果你在课堂上添加记忆点,你真的会嘲笑......

在你的情况下不要依赖于此,这就是为什么不:

Conditions for automatic generation of default/copy/move ctor and copy/move assignment operator?

答案 3 :(得分:0)

问题是由于您尝试复制构造std::unique_ptr(通过复制Node),根据定义,does not have复制构造函数。

您可能打算使用std::shared_ptr