0

循環キューであるオブジェクトのコピーを作成しようとしています。Enqueue と Dequeue は正しく動作しますが、これを行うたびに実行時エラーが発生します。

CQUEUE j = k;

出力ウィンドウに、コピー コンストラクターがすべての制御パスで再帰的であると表示されます。誰かが私が間違っていることを理解するのを手伝ってくれますか? これが私のコピー コンストラクターと、オーバーロードされた代入演算子です。

CQUEUE::CQUEUE(const CQUEUE& original)
{
(*this) = original;
}


void CQUEUE::operator=(CQUEUE w)
{
qnode *p = w.front;
(*this).front = new qnode;
(*this).back = front;

while(p -> next != w.back)
{
  back -> num = p -> num;
  p = p -> next;
  back -> next = new qnode;
  back = back -> next;
}

back -> num = p -> num;
p = p -> next;
back -> next = new qnode;
back = back -> next;
back -> num = p -> num;

back -> next = front;
front -> prev = back;
}
4

3 に答える 3

4
(*this) = original;

= 演算子は現在非定数の値渡し CQUEUEを使用しているため、コンパイラはこの行で = 演算子の代わりにコピー コンストラクターを呼び出します。代わりに、= 演算子は次のようになります。

void CQUEUE::operator=(const CQUEUE& w)

次に、コピー コンストラクターは代わりに operator = を呼び出します。または、より明示的にします。

CQUEUE::CQUEUE(const CQUEUE& original)
{
    Copy(original);
}

void CQUEUE::operator=(const CQUEUE& w)
{
    Copy(w);
}

void CQUEUE::Copy(const CQUEUE& other)
{
    // All your copy code here
}

編集:はい、あなたは正しいです、まだコピー コンストラクターが必要です。

于 2012-07-10T05:42:56.080 に答える
1

やや逆向きにやっています。

一般に、割り当て演算子はコピー コンストラクターよりも複雑です。これは、新しい値への移動に加えて、保持されているリソースを適切に破棄する必要があるためです。

通常、すべてを行う部分を作成してその上に単純なシステムを表現するよりも、単純な部分から複雑なシステムを構成する方が簡単です。あなたのコンテキストでは、コピーコンストラクターから代入演算子を作成する方が簡単であることを意味します。

したがって、コピー コンストラクターを完全に記述するだけです。

CQUEUE(CQUEUE const& c) { ... }

CQUEUE次に、2 つのインスタンスをスワップ (内容を交換) するルーチンを作成します。

void swap(CQUEUE& c) {
    using std::swap;
    swap(front, c.front);
    swap(back, c.back);
}

最後に、それらから代入演算子を作成します。

CQUEUE& operator=(CQUEUE c) { // copy
    this->swap(c);
    return *this;
}

このイディオムは、コピー アンド スワップとして知られています(そうです、とてもクリエイティブです!)。

注: おまけに、move コンストラクターがある場合は、無料で move-and-swap になります。

于 2012-07-10T06:44:39.227 に答える
1

代入演算子関数を に変更し、自己代入に注意する

void CQUEUE::operator=(const CQUEUE& w)
{
   if (this == &w)
        return *this;

   //Paste your code
}
于 2012-07-10T05:39:47.537 に答える