我正在尝试复制我的复制构造函数中的整个链表,但是我仍然可以访问 为什么我的复制结构不能正常工作? 错误:
Unhandled exception at 0x00AE506C in program.exe: 0xC0000005: Access violation reading location 0x00000004.
复制构造函数
NodeSLList::NodeSLList(NodeSLList & list)
{
head = list.head;
IntNode *tmp = head;
cout << "copy constructor called" << endl;
int size;
size = list.GetSize();
for (int i = 1; i <= size; i++)
{
tmp->data= list.RetrieveNode(i).data;
tmp->next = list.RetrieveNode(i).next;
tmp = tmp->next;
}
}
主中的
NodeSLList list2 (list1);
cout << "cout << list2 " << endl;
cout << list2 << endl;
错误发生在cout << list2 << endl;
,因为警察构造函数没有正确复制链表。
答案 0 :(得分:2)
一个问题是:
head = list.head;
IntNode *tmp = head;
你应该不复制指针值。你最终会得到两个指向同一个内存的指针。两个对象应具有不同的head
值。
如果您有一个将节点添加到链接列表的函数,则可以在复制构造函数中使用它来避免这种情况。这是一个例子:
NodeSLList::NodeSLList(const NodeSLList & list) : head(0)
{
int size;
size = list.GetSize();
for (int i = 1; i <= size; i++)
addData(list.RetrieveNode(i).data);
}
这要求您具有类似于addData
的函数,该函数使用传入的数据添加新节点。请注意,这将测试您的addData
函数以确保其正常工作。复制构造函数只是在循环中调用它。
最后,您还需要一个赋值运算符来复制构造函数(以及析构函数)。赋值运算符可以使用复制构造函数和析构函数作为辅助函数(即copy/swap
成语)来编写。