复制构造函数遍历链表。履行

时间:2014-11-15 03:11:41

标签: c++ pointers constructor linked-list copy-constructor

我正在尝试复制我的复制构造函数中的整个链表,但是我仍然可以访问 为什么我的复制结构不能正常工作? 错误:

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;,因为警察构造函数没有正确复制链表。

1 个答案:

答案 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成语)来编写。