2016-10-16 7 views
-1

代入演算子の概念を頭に入れたり、少なくともそれらを正常に作成するのに問題があります。C++の二重リンクリストの代入演算子

コピーコンストラクタは私にとって問題ではありません。私は、サンプルコードを読んでいた

//copy constructor 
Set::Set(const Set &rhs){ 
    _head = rhs._head; 
    _tail = rhs._tail; 

    //null, basically this object is 0 
    if(rhs._head == NULL){ 
     _head = NULL; 
     _tail = NULL; 
     _size = 0; 
    }else{ 
     _head = new Elem(*rhs._head); 
     _tail = new Elem(*rhs._tail); 
     _size = rhs._size; 

     Elem *prev = NULL; 
     Elem *curr = _head; 
     Elem *otherCurr = rhs._head; 
     int counter = 0; 
     while(otherCurr->next != NULL){ 
      curr->next = new Elem(*otherCurr->next); 
      curr->next->prev = curr; 


      curr = curr->next; 
      otherCurr = otherCurr->next; 
     } 

     //now that we are done lets setup the tail 
     _tail->prev = curr; 
     curr->next = _tail; 

    } 

} 

、及び一部の人々はそれを実装するために#include <algorithm>ライブラリを使用しました:ここにその作業という私のものです。私は代わりにそれを試みたが、全く動作していないようだ。

//assignment operator 
Set& Set::operator=(const Set &rhs){ 
    Set temp(rhs); 
     std::swap(temp._head,_head); 
     std::swap(temp._tail, _tail); 
     return *this; 

} 

このコードは正しく動作しません。代入演算子の作成方法の概念を理解することは本当に苦労しています。私はそれが基本的にあなたが1つから別の値をコピーしたいと同じように動作すると思った。しかし明らかにそうではありません。もし誰かがそれを得る方法について私にアドバイスできたら、それはすばらしいことになるでしょう。

私のクラスのちょっとした情報は、リストの先頭と末尾を指すa _heada _tailです。ダミー要素。ここで

は、オブジェクトが構成されている方法です:

は、私はあなたのコピーコンストラクタを持つ2つの問題を参照してください
struct Elem { 
     ELEMENT_TYPE info; 
     Elem *prev, *next; 
    }; 
    Elem *_head, *_tail; 
    int _size; 
+0

[mcve]を無効にして投票を終了します。トピック:コピーコンストラクタ内の潜在的な傷害の全世界: '_head = rhs._head; _tail = rhs._tail; 'トピックオフ:アンダースコアのプレフィックスで注意してください。これらは通常、内部ライブラリの使用のために予約されています。あなたはここで安全でなければなりませんが、グローバルスコープでそれを行うか、大文字でその下線をたどってください。あなたは困っているかもしれません。 – user4581301

+0

一言、downvoteのおかげで。大きな助け –

+0

なぜ 'std :: list'を使うのではなく、手動でリンクリストを実装していますか? –

答えて

0

(とさらに掘るしようとしていない):

  1. 尾の目的は何ですか?それは必要と思われないか、正しく使用されていません。
  2. otherCurr->次にNULLのコピーループが停止しているようです。しかし、最後の要素のcurr-> nextをtailに指定します。そして、これは、あなたのセットより1つ後の要素をコピーするか、さらに悪化させることを意味します(あなたの定義を正確に見て初期化しないかもしれないので)、ランダムな場所をコピーしようとしています。
+0

コピーコンストラクタが動作します –

+2

いいえ、ここに示すように、そうではありません。もしあなたがそうであれば、あなたはおそらく(幸い)幸運です。あなたはあなたのクラス不変式について考えなかったので、異なるコンストラクタでそれらを初期化していません。 – Tomek

+0

問題なく動作します –

関連する問題