У меня есть метод, включающий копирование некоторых пользовательских типов из одного связанного списка в другой, основанный на очень простых критериях. Это должно быть сделано с помощью оператора присваивания. В конце метода этот новый список отображается, а затем удаляется. Проблема здесь в том, что удаление нового списка также удаляет соответствующие узлы исходного списка, что сигнализирует мне, что либо оператор присваивания не функционирует должным образом, либо у рассматриваемого метода есть проблемы.
Кажется, что сам метод работает нормально. Он успешно перемещается по копии исходного списка, идентифицирует студентов, которые соответствуют требуемым критериям, и добавляет их к 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()
удаляет обе копии узла. Мне интересно, почему это так, и как предоставляемый код может быть изменен, чтобы это поведение прекратилось. Спасибо всем.