Оператор присваивания возвращает "пустой" экземпляр, когда не должен?

Я реализую стек только для практики. Итак, в основном, у меня есть что-то вроде этого:

Stack stack;
stack.push(element1;
stack.push(element2);

Stack copy;
copy = stack;

Поэтому я перегружаю оператор присваивания, потому что я хочу также генерировать новые экземпляры элементов (а не просто копировать указатель каждого элемента из одного в другой) следующим образом

Stack &Stack::operator=(const Stack &toCopy) {
    Stack* stack = new Stack;
    if (toCopy.first == NULL) return *stack;
    for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
        stack->push(actual->elem);
    }
    // In this state, *stack has 2 elements as it should
    return *stack;
}

Вернувшись в главное, переменная копирования не получает изменения... Она по-прежнему пуста, как будто назначения никогда не было. Как будто я должен был сделать просто Stack copy; Не могли бы вы объяснить мне, что здесь происходит?

2 ответа

Решение

Вы не изменяете текущий объект (т.е. *this).

Вы просто создаете новый объект new, а затем вернуть его. Примечание для copy = stack;, это эквивалентно copy.operator=(stack);обратите внимание, что возвращаемое значение не используется, оно просто отбрасывается (и вызывает утечку памяти), и copy не изменился

Вы должны сделать что-то вроде:

Stack &Stack::operator=(const Stack &toCopy) {

    // do some work to clear current elements in *this
    // ...

    // add elements from toCopy
    for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
        this->push(actual->elem);
    }

    // operator= is supposed to return *this in general
    return *this;
}

Возможно, вы неправильно понимаете оператор присваивания. Работает в контексте объекта слева от знака равенства. Так что ваши ::operator=(...) всегда должен работать над *this и всегда должен возвращаться *this также.

operator=(...) то, что вы разместили, работает с новым объектом стека, который вы разместили в куче, и вы работаете с ним вместо *this,

Вы можете эффективно заменить stack с this в вашем коде. То есть:

Stack &Stack::operator=(const Stack &toCopy) {
    //Stack* stack = new Stack; // Don't do this.
    if (toCopy.first == NULL) return *this;
    for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
        this->push(actual->elem); // You could also just call push without "this->"
    }
    // In this state, *stack has 2 elements as it should
    return *this;
}
Другие вопросы по тегам