所以我做了这个排序的双链表代码。我应该超载一些运营商。但是,当我尝试在其中一个函数中创建一个新的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会在返回之前自行销毁,然后在程序的最后,它会再次尝试销毁自己(什么?)但是由于它已经解除分配,它将无法销毁它然后出现错误起来。
您有一个复制赋值运算符只能分配单个数字,而不是复制整个列表。如果要将列表分配给另一个列表,则需要一个正确的复制赋值运算符来执行深层复制。
当你这样做
myList = myList + myList2;
编译器会将其翻译为
myList.operator=(myList + myList2);
您可能还想了解the rule of three。
这不是您应该编写二元运算符+的方式。
请参阅二进制算术运算符中的https://stackoverflow.com/a/4421719/3819284
编辑:正如Joachim Pileborg所说,你的代码缺少SortedDoublyLinkedList
的正确赋值运算符。