1

Я реализую стек только для практики. Так, в основном, у меня есть что-то вроде этого:Оператор присваивания возвращает «пустой» экземпляр, если он не должен?

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; Не могли бы вы объяснить мне, что здесь происходит?

+0

Почему downvote? – jscherman

+2

похоже, что у вас есть некоторые основные недоразумения в отношении управления памятью. Ваша 'operator =' утечка памяти («новый стек» никогда не 'delete'd). Также он никогда не обновляет '* this', вместо этого вы обновляете новый стек и никогда ничего не делаете с новым стеком. Вероятно, есть много ошибок в других частях вашего кода, которые вы не публиковали. В будущем опубликуйте [MCVE] (http://stackoverflow.com/help/mcve), и жизнь станет намного проще, если вы перестанете использовать необработанные указатели. –

+2

Возможно, вы должны изменить 'this' в' operator = ', а не возвращать новый стек. – Ryan

ответ

3

Вы не изменяете текущий объект (т. Е. *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; 
} 
+0

Ohhhhh я вижу .... я не могу поверить, что не видел этого. Спасибо вам !!! – jscherman

2

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

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

Вы можете эффективно заменить stackthis в своем коде. I.e .:

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; 
} 
+0

Спасибо! Довольно ясно сейчас :) – jscherman

Смежные вопросы