Я реализую стек только для практики. Так, в основном, у меня есть что-то вроде этого:Оператор присваивания возвращает «пустой» экземпляр, если он не должен?
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;
Не могли бы вы объяснить мне, что здесь происходит?
Почему downvote? – jscherman
похоже, что у вас есть некоторые основные недоразумения в отношении управления памятью. Ваша 'operator =' утечка памяти («новый стек» никогда не 'delete'd). Также он никогда не обновляет '* this', вместо этого вы обновляете новый стек и никогда ничего не делаете с новым стеком. Вероятно, есть много ошибок в других частях вашего кода, которые вы не публиковали. В будущем опубликуйте [MCVE] (http://stackoverflow.com/help/mcve), и жизнь станет намного проще, если вы перестанете использовать необработанные указатели. –
Возможно, вы должны изменить 'this' в' operator = ', а не возвращать новый стек. – Ryan