2017-10-23 5 views
0

ダブルリンクリストの移動コンストラクタを作成しようとしていますが、動作していません。誰かが私が間違っていることを見つけるのを助けることができますか?ここで リンクリストコンストラクタの移動

は私のクラスである:

class SortedList { 
    struct Node { 
     T data_; 
     Node* next_; 
     Node* prev_; 
     Node(const T& data = T{}, Node* nx = nullptr, Node* pr = nullptr) { 
      data_ = data; 
      next_ = nx; 
      prev_ = pr; 
     } 
    }; 

    Node* front_; 
    Node* back_; 
    int sizelist; 
} 

そして、ここに私の移動のコンストラクタです:あなたは、古いオブジェクトからのデータの所有権を取得し、古いオブジェクトに空のリストを作るべき

SortedList<T>::SortedList(SortedList&& rhs) { 
    if (&rhs != this) { 
     sizelist = rhs.sizelist; 
     front_ = rhs.front_; 
     back_ = rhs.back_; 

     Node* head = rhs.front_;  
     Node* headNext =rhs.front_->next_;  
     for (int i = 0; i < rhs.sizelist-1; i++) { 
      head = nullptr; 
      head = headNext;    
      headNext = headNext->next_;   
     } 
     rhs.sizelist = 0; 
    } 
} 
+1

リンクされたリストのインスタンスを紙面に描き、移動割り当てに何をすべきかを描くことをお勧めします。 – juanchopanza

+0

ユーザが提供するコンストラクタは、クラス定義で宣言する必要があります。 'T 'は' SortedList'で定義されていません。実際のコードを投稿してください –

+0

「うまくいきません」というのは役に立つ問題の説明ではありません。より具体的にしてください。 – molbdnilo

答えて

0


移動コンストラクタで「自己コピー」をテストする必要はありません。

SortedList<T>::SortedList(SortedList&& rhs) 
{ 
    sizelist = rhs.sizelist; 
    rhs.sizeList = 0; 
    front_ = rhs.front_; 
    rhs.front_ = nullptr; 
    back_ = rhs.back_; 
    rhs.back_ = nullptr; 
} 
+0

古いオブジェクトを無効にする必要がありますか?移動したオブジェクトがユーザーによって使用/到達されることはないと仮定していませんか? – Fureeish

+1

@Fureeishあなたは間違いなく元のオブジェクトを無効にすることは望ましくありません。有効な状態にしておく必要があります。これは、少なくとも後に破棄されることがあり、使用されることさえあります。コンテナの最も単純な有効な状態は、通常は空の状態です。 – molbdnilo