我有一种方法,可以根据非常简单的标准将一些自定义类型从一个链表复制到另一个链表。这可以使用赋值运算符来完成。在方法末尾,将显示此新列表,然后将其删除。这里的问题是,删除新列表也会删除原始列表的相应节点,这向我发出信号,即赋值运算符未按预期运行,或者所涉及的方法有问题。
该方法本身似乎可以正常工作。它可以成功导航原始列表的副本,识别出符合所需条件的学生,并将其添加到newList
中。然后,它继续正确显示newList
的预期内容,并退出该方法而没有错误。因此,问题在于原始列表中的相应节点也被删除,而不仅仅是newList
中的节点。这可以通过以下事实验证:在到达选定节点之一时显示列表崩溃,或者在崩溃之前退出程序-这会将原始列表保存到文本文件,当打开该文件时,表明条目已被删除。替换为不正确的值。
有问题的方法
void moreThan80Credits()
{
Container* tempList = list;
Container* newList = new Container();
Container* studentToAdd = new Container();
Container* head = new Container();
while(tempList) {
if(tempList->student->getCredits() > 80) {
studentToAdd->student = tempList->student;
if(!newList->student) {
newList->student = studentToAdd->student;
head = newList;
} else {
while(newList->next) {
newList = newList->next;
}
newList->next = studentToAdd; // adding to tail
}
}
tempList = tempList->next;
}
newList = head; // returning to beginning of newList, to display.
if(!newList->student) {
cout << endl << "There are no students with more than 80 credits." << endl;
return;
}
cout << "The students with more than 80 credits are:" << endl;
while(newList) {
newList->student->displayInfo();
Container* removal = newList;
newList = newList->next;
delete removal->student; // displaying and deleting, together
delete removal;
}
return;
}
然后是赋值运算符:
Student& Student::operator=(const Student& s) {
if (this == &s) return *this; // self assignment check
this->name = s.name;
this->rollNo = s.rollNo;
this->level = s.level;
this->credits = s.credits;
return *this;
}
以及相关的构造函数:
Student::Student() { // default constructor
// empty, everything should be null
}
Student::Student(const Student& that) { // copy constructor
this->name = that.name;
this->rollNo = that.rollNo;
this->level = that.level;
this->credits = that.credits;
}
如前所述,moreThan80Credits()
末尾的删除部分将删除该节点的两个副本。我想知道为什么会这样,以及如何修改提供的代码以停止这种行为。谢谢大家。