2016-09-12 5 views
0

リンクリストを作成しようとしていますが、ノードを2回削除するため、問題が発生しています。この問題は、ノードが関数に渡されたときにのみ発生します(参照によって渡された場合はすべて正常です)。関数に渡されるオブジェクトが、ポインタがノードを指しているようにコピーされていると考えられます元のリストから新しいリストではない。私は=演算子をオーバーロードすることでこれを回避しようとしましたが、これはどちらもうまくいきませんでした。私が間違っていることの説明はすばらしいでしょう。助けのためのC++リンクリストが機能しない

おかげ

#include <iostream> 

struct node{ 
    node(int n){ 
     if (n == 1){ 
      data = 1; 
      next = NULL; 
     } 
     if (n == 2){ 
      data = 2; 
      next = new node(1); 
      next -> next = NULL; 
     } 
    } 
    ~node(){ 
     std::cout << data << std::endl; 
     if (next != NULL) delete next; 
    } 

    void operator=(node a){ 
     next = NULL; 
    } 

    int data; 
    node* next; 
}; 

void func2(node v){ 
} 


int main(){ 

    node v(2); 
    if (v.next -> next == NULL) std::cout << "true\n"; 
    func2(v); 

    return 0; 
} 

答えて

3

あなたの疑惑が正しいですが、そこに問題があります。ノードをfunc2に渡すと、リスト全体ではなく最初のノードだけがコピーされます。コピーコンストラクタは最初のノードと最初のノード(最初の2番目のノードを指す)のポインタをコピーします。vfunc2の範囲外になると、そのノードは一度削除されてから、スコープから外れると再び削除されますmain 「ディープコピー」を実行するためにコピーコンストラクタを作成し、リスト全体を走査し、すべてのノードを新しいアドレスにコピーする必要があります。

コピーコンストラクタはほとんどの場合、*thisを返すことを覚えておいてください。これは、C++ FAQとScott Meyersの著書「Effective C++」にあります。したがって、署名は次のようになります。

node& operator=(const node& node); 

代入演算子をオーバーロードする場合は、おそらくコピーコンストラクタも定義する必要があります。ちなみに、問題を説明するうまい仕事。

編集:コードは次のようになります。私はこれをテストしていないことをお詫びします。私はタブレットの上にあり、これを編集するのは苦痛です...

#include <iostream> 

struct node{ 
    node(const node& toCopy) : data(toCopy.data) 
    { 
     if(toCopy.next != null) { 
      next = new node(toCopy); 
     } 
    } 

    node(int n){ 
     if (n == 1){ 
      data = 1; 
      next = NULL; 
     } 
     if (n == 2){ 
      data = 2; 
      next = new node(1); 
      next -> next = NULL; 
     } 
    } 

    node& operator=(const node& toCopy) { 
     if(&toCopy != this) { 
      data = toCopy.data; 

      if(next != NULL) { 
       next = new node(toCopy); 
      } 
     } 

     return *this; 
    } 

    ~node(){ 
     std::cout << data << std::endl; 
     if (next != NULL) delete next; 
    } 

    int data; 
    node* next; 
}; 

void func2(node v){ 
} 


int main(){ 
    node v(2); 
    if (v.next -> next == NULL) std::cout << "true\n"; 
    func2(v); 

    return 0; 
} 
+0

お返事ありがとうございます。これを修正する方法を説明することができれば、それはすばらしいことになります。なぜ私の演算子=過負荷が働いていないのか、それ自体で問題を解決するのか、私は本当に明確ではありません。 – fred

関連する問題