所以我做了这个排序的双链表代码。我应该超载一些运营商。但是,当我尝试在其中一个函数中创建一个新的SDL(已排序的双列表)时,它会在我设法将其返回到main函数之前自行销毁。我尝试这么多次调试。我看到错误发生的地方,但我不知道如何解决它。这是代码,事情搞砸了。
SortedDoublyLinkedList SortedDoublyLinkedList::operator+(const SortedDoublyLinkedList & otherList)
{
SortedDoublyLinkedList myNewList(otherList);
Node *currentNode = head;
while (currentNode) {
myNewList.add(currentNode->value);
currentNode = currentNode->next;
}
return myNewList; // destroys itself
}
当编码器写入" mylist = mylist + mylist2"一起添加2个列表。
这是另一个:
SortedDoublyLinkedList SortedDoublyLinkedList::operator+(const int & myNumber)
{
SortedDoublyLinkedList myNewList(*this);
myNewList.add(myNumber);
return myNewList; // destroys itself
}
同样的交易。
测试用例如下:
myList + = myList2; //正常工作!
myList + = myList + 15; //正常工作!
SortedDoublyLinkedList myList3 = myList + 15; //创建一个新列表而不修改myList,正常工作!
用户键入时出现错误:
myList = myList + myList2;
myList = myList + 15;
我不知道为什么会这样。在上面的两个函数中,myNewList会在返回之前自行销毁,然后在程序的最后,它会再次尝试销毁自己(什么?)但是由于它已经被释放,它将无法破坏它并且然后会弹出一个错误。
答案 0 :(得分:1)
您只有一个复制赋值运算符来分配单个数字,而不是复制整个列表。如果要将列表分配给另一个列表,则需要一个正确的复制赋值运算符,它可以执行深层复制。
当你这样做时
myList = myList + myList2;
编译器会将其翻译为
myList.operator=(myList + myList2);
您可能还想了解the rule of three。
答案 1 :(得分:0)
这不是您应该编写二元运算符+的方法。
在 二进制算术运算符
上查看https://stackoverflow.com/a/4421719/3819284 编辑,正如Joachim Pileborg所说,您的代码缺少SortedDoublyLinkedList
的正确赋值运算符。