Оператор присваивания возвращает "пустой" экземпляр, когда не должен?
Я реализую стек только для практики. Итак, в основном, у меня есть что-то вроде этого:
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;
}