0

オーバーロード演算子メソッドを使用して、あるキューのエントリを別のキューにコピーしようとしましたが、関数が間違っています。以下にある方法以外の方法で、キューの「元の」値にアクセスする方法がわかりません。

struct Node
{
   int item;
   Node* next;
};

class Queue
{
public:
    // Extra code here
    void operator = (const Queue &original);
protected:
    Node *front, *end;
};

void Queue::operator=(const Queue &original)
{
    //THIS IS WHERE IM GOING WRONG
    while(original.front->next != NULL) {
        front->item = original.front->item;
        front->next = new Node;
        front = front->next;
        original.front = original.front->next;
    }
}
4

2 に答える 2

3

機能的なコピーコンストラクターはありますか?もしそうなら、私はあなたのコピーコンストラクターの観点からあなたの代入演算子を次のように実装します:

#include <algorithm>  // <utility> for C++11

void Queue::operator=(const Queue &other)
{
    // Assumes your only field is the "front" pointer.

    Queue tmp(other);   // May throw.
    std::swap(front, tmp.front);  // Will not throw.
}

アイデアは、operator new()リソースをクリーンアップする一時オブジェクトの側で例外をスローする可能性のある操作(への呼び出しなど)を実行し、スローしない操作でコンテンツを交換することによって変更を「コミット」することです。Queueの構築中に例外がスローされた場合でも、あなたの状態は正常であることtmp。ポインタの割り当てはスローされないことが保証されているため、std::swap()この場合、への呼び出しはスローされません。代入演算子のスコープを離れると、tmpデストラクタは古いリンクリストfrontと交換されたため、古いリンクリストをクリーンアップする必要がありますfront

この「一時的およびスワップへのコピー」イディオムの詳細と、それが強力な例外安全性保証とどのように関連しているかについては、 GotW#59を参照してください。

于 2012-04-10T00:21:27.547 に答える
2
void Queue::operator=(const Queue &original)
{
    Node* tmp = original.front;
    //THIS IS WHERE IM GOING WRONG
    while(tmp->next != NULL) {
        front->item = tmp->item;
        front->next = new Node;
        front = front->next;
        tmp = tmp->next;
    }
}
于 2012-04-09T23:29:23.850 に答える