Я пытаюсь скопировать весь связанный список в свой конструктор копирования, однако я продолжаю получать доступ. Почему моя копия не работает правильно? ошибки:
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;
поскольку конструктор кода неправильно скопировал связанный список.
Одна из проблем заключается в следующем:
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
Идиомы copy/swap
).
1
? В C ++ первый элемент (обычно)0
. Кроме того, у вас есть функция, которая добавляет узел в конец списка? Если это так, то конструктор копирования намного проще, чем тот, который вы написали.