我现在正在学习C ++(就像2天前一样开始)我在编写Node的Copy C&C时遇到了一些麻烦。 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);
}
}
注意:我有运算符*所以*虚拟结果为T型。
另一个注意:我的公共和私人领域可能是错误的 - 但我稍后会处理它。
稍等一下后,让我们看一下C副本吧。
它获得了Node的const引用,然后我尝试创建一个指向它的指针。编译器输出错误:
Node<T>* dummy= &node;
结果invalid conversion from 'const Node<int>*' to 'Node<int>*'
(我有一个简短的主要尝试创建Node<int>
)。
好的,好像我似乎无法创建一个指向const的指针,所以我试图像代码中所示那样手工复制它的字段。 当我运行Eclipse调试器并检查它是否有效时 - 确实如此。 但是,当我继续制作步骤时,在 head (在复制构造函数的末尾)调用D&#39;并且因此一切都崩溃了。 所以我不知道下一步该怎么做,或者即使我的方式正确。
我应该如何制作复制构造函数?我想我明白了为什么叫D&#tor;(我创造了一些东西,在块的最后,某些东西被破坏了 - 对吗?),但我不知道如何使它正确。
答案 0 :(得分:1)
复制构造函数的目的是制作一个“完全复制”的副本。传递的对象。因此,根据data
和next
指针的语义,您只需使用初始化列表分配它们:
Node(const Node& node): data(node.data), next(node.next) {}
由于这与预期的默认行为(复制成员)一样,您可以简单地省略复制构造函数,编译器默认会生成一个合适的构造函数。
请注意,您肯定可以创建指向const
对象的指针:编译器抱怨的是指针的类型声明在此过程中丢失了const
位。
第二个注意事项:对于深层复制,您可以使用以下内容:
Node(const Node& node):
data(node.data == NULL? NULL: new T(*node.data)),
next(node.next == NULL? NULL: new Node(*node.next)) {}
当然,在那种深层复制方案中,您的容器正在使用&#34;所有权&#34;成员字段(提示问题:为什么它们首先是指针?)因此应该小心在析构函数中正确地delete
。
答案 1 :(得分:0)
您发布的代码与您引用的错误语句完全匹配:
Node<T>* dummy= &node;
但无论如何,你可以这样做:
const Node<T>* dummy= &node;
由于node
为const
,因此对其的任何引用或指针也必须为const
。您还无法在node
上调用非const方法,因此您为数据访问器设置的任何方法都需要是const-correct。