2016-10-16 9 views
1

ここに質問を投稿するのは初めてです!私は、単一リンクリストのコピーコンストラクタを作成する際にいくつかの問題を抱えていました。私は、これと他のさまざまなサイトで比較可能な例を探し求めています。私はスマートポインタを使用しようとしていましたが、これまではunique_ptr(s)しか使用していませんでした。この関数は、渡されているリンクリストの詳細コピーを作成するためのものです。私はこれまでのところ以下のことを試しましたが、私はsegfaultしか取得しません。私はいくつかのテストを実行したと私はinsert_front()insert_back()の機能が正常に動作していると私は信じています。私は頭と尾の両方へのポインタを持っています。以下は私が試したコードです。スマートポインタを利用した単一リンクリストのコピーコンストラクタの実装方法

Deque::Deque(const Deque& deque2copy){ 
    this -> head = 0; 
    unique_ptr<Node> temp = make_unique<Node>(deque2copy.head -> val, move(deque2copy.head->next)); 
    while(temp != 0){ 
     this ->insert_back(temp->val); 
     temp = move(temp-> next); 
    } 
} 

UPDATE#1

Deque::Deque(const Deque& deque2copy){ 

    if(deque2copy.head->next == nullptr){ 
     return; 
    } else { 
     this -> head = 0; 
     unique_ptr<Node> temp = make_unique<Node>(*deque2copy.head->next); 
     while(temp != 0){ 
      this ->insert_back(temp->val); 
      temp = move(temp-> next); 
     } 
    } 

} 
+2

なぜコピーしているコンテナから移動していますか?これは 'auto_ptr'の直感的ではありません。 – krzaq

+0

は' move() 'なしでコンパイルされたようです。 'unique_ptr'のコピーを許可する必要があると思いましたか? – Shrayan

+1

移動すると移動できます。あなたが動くと、もはやオリジナルを手に入れません。私はあなたが 'make_uniqueを望んでいたと思うかもしれないと思うかもしれません。 – krzaq

答えて

0

あなたのDequeNodeクラスが実際に正確にどのように見えるかについて多くの情報を掲載しませんでした。あなたのコードスニペットから見た情報に基づいて、あなたの主な問題はstd::unique_ptr<T>を使ってあなたのリストをナビゲートすることです:それはうまくいかないでしょう:ヌル以外のstd::unique_ptr<T>が割り当てられたり破棄されたりすると、所有していないポインタが必要です。

あなたは多くのコンテキスト情報を投稿していなかったので、私は簡単にこのコードが動作するかどうかをテストすることができませんでしたが、私はそれは問題ないはずと仮定したい:このコードは非使用して二つのリストをナビゲート

Deque::Deque(const Deque& deque2copy) 
    : head() { // the default constructor does the null-initialization 
    std::unique_ptr<Node>* tail(&this->head); 
    for (Node* temp(deque2copy.head.get()); temp; temp = temp->next.get()) { 
     *tail = std::make_unique<Node>(temp->value); 
     tail = &tail->next; 
    } 
} 

に留意されたいです。それはstd::unique_ptr<Node>を割り当てるか、破壊するときNodeオブジェクトを破壊回避するstd::unique_ptr<Node>::get()から得Node*を使用するソースリストについて

  • :ポインタを-owning。 宛先リストリスト内の現在の最後std::unique_ptr<Node>へのポインタtailため
  • (最初 headこれはリストの最後 nextポインタが割り当てられた後)を効率よくノードを追加するために維持されます。

コードがNodeは、コンストラクタの引数としてvalueを取るコンストラクタを持っていることを前提としていません。

Node::Node(T const& value) 
    : value(value) 
    , next() { 
} 

リストの要素のために所有するポインタを使用することが一般的に悪い考えであることに注意してください:頭の​​デストラクタが再帰的になります。このコンストラクタは、value応じてメンバーとデフォルトは例えば、nextメンバーを初期化する初期化しますリスト内のすべてのノードのデストラクタを呼び出します。デストラクタの実際の記述方法によっては、この再帰によってスタックオーバーフローが発生しやすくなります。これを回避するには、この再帰を避けるためにリストのカスタムデストラクタを記述する必要があります。しかし、このようにすると、ノードの開始を維持するためにstd::unique_ptrを使用する目的が完全に無効になります。

関連する問題