1

私は練習のためだけにスタックを実装しています。だから、メインでは、私はこのような何かを持っている:割り当てオペレータは、「空の」インスタンスを返してはなりません。

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

Stack copy; 
copy = stack; 

私は新しい要素インスタンスを生成したいので、だから私はまた、代入演算子をオーバーロードしています(とちょうど1から各要素のポインタをコピーしません

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 ='はメモリをリークします( 'new Stack'は決して' delete'dされません)。また、 '* this'を更新することはなく、代わりに新しいスタックを更新し、新しいスタックでは何もしません。あなたが投稿しなかったコードの他の部分にはおそらく多くのエラーがあります。将来、[MCVE](http://stackoverflow.com/help/mcve)を投稿すると、生のポインタの使用をやめたほうがはるかに簡単になります。 –

+2

'operator ='で 'this'を修正し、新しいスタックを返さないようにしてください。 – 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も返す必要があります。あなたはヒープに割り当てられました新しい Stackオブジェクト上で動作して掲示し、あなたがそれ代わりの*this上で動作している

operator=(...)

stackthisに変更すると効果的です。私:

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

関連する問題