Оператор присваивания приводит к удалению желаемого значения - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть метод, включающий копирование некоторых пользовательских типов из одного связанного списка в другой, основанный на очень простых критериях. Это должно быть сделано с помощью оператора присваивания. В конце метода этот новый список отображается, а затем удаляется. Проблема здесь в том, что удаление нового списка также удаляет соответствующие узлы исходного списка, что сигнализирует мне, что либо оператор присваивания не функционирует должным образом, либо у рассматриваемого метода есть проблемы.

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

...