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

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

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

Call to implicitly deleted copy constructor

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

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

4 回答 4

2

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

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

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

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

并让你的子类实现它

PS:不要忘记界面中的virtualor protecteddtor

于 2013-05-17T15:12:47.067 回答
1

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

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

另一种选择是使用某种“智能”指针指针(即std::shared_ptr)。但在这种情况下,你会得到一个浅拷贝而不是深拷贝

于 2013-05-17T15:11:05.253 回答
0

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

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

自动生成默认/复制/移动 ctor 和复制/移动赋值运算符的条件?

于 2013-05-17T15:08:37.197 回答
0

问题是由于您尝试复制构造 a std::unique_ptr(通过复制 a Node)引起的,根据定义,它没有复制构造函数。

您可能打算使用std::shared_ptr.

于 2013-05-17T15:10:22.933 回答