【发布时间】:2015-08-27 21:18:04
【问题描述】:
我现在正在学习 C++(大约 2 天前开始),我在编写 Node.js 的 Copy C'tor 时遇到了一些麻烦。 Node 是一个类如下:
template <class T>
class Node {
T* data;
Node<T>* next;
friend class Iterator<T>;
public:
Node():data(NULL),next(NULL){}
Node(const T& data):data(NULL),next(NULL){
T* copy = new T(data);
this->data = copy;
}
Node(const Node& node):data(NULL),next(NULL){
Node<T> dummy;
dummy.data = node.data;
dummy.next = node.next;
Node<T>* head=new Node(*dummy);
*this = *head;
while(dummy.next != NULL) {
dummy = *(dummy.next);
head = head->next;
head = new Node(*dummy);
}
}
注意:我有 operator* 所以 *dummy 结果为 T 类型。
另一个注意事项:我的公共和私有字段可能是错误的 - 但我稍后会处理它。
你吐了一点之后,让我们看看Copy C'tor。
它获得了 Node 的 const 引用,然后我尝试创建一个指向它的指针。编译器输出错误:
Node<T>* dummy= &node; 结果invalid conversion from 'const Node<int>*' to 'Node<int>*'(我有一个简短的主要尝试创建Node<int>)。
好的,看来我无法创建指向 const 的指针,所以我尝试手动复制它的字段,如代码所示。 当我运行 Eclipse 调试器并检查它是否有效时 - 它确实有效。 但是,当我继续执行步骤时,会在 head 上调用 D'tor(在复制构造函数的末尾),结果一切都崩溃了。 所以我不知道下一步该做什么,或者即使我的方法是正确的。
我应该如何制作复制构造函数?我想我明白为什么要调用 D'tor(我创造了一些东西,在块的末尾,一些东西被破坏了 - 对吧?),但我不知道如何使它正确。
【问题讨论】:
-
这里的主要问题是您似乎不清楚“复制节点”的确切含义。尝试先确定这一点。看起来这可能是链表中的一个节点。因此,只需复制它就会让您的两个节点指向同一个 "next" ,这会破坏列表结构。您的代码似乎试图通过克隆列表的整个其余部分来解决此问题。但是,然后您在下一个节点上调用复制构造函数(如果成功,它将复制整个节点),因此您实际上最终几乎是平方列表!另外,你浅拷贝
data。 -
鉴于复制节点的含义不是很清楚,我的建议是禁用复制构造函数;并添加一个名为
clone的函数,它会复制所有节点和数据。你当然可以有一个移动构造函数和移动赋值运算符。
标签: c++ constructor nodes copy-constructor const-reference