2016-11-22 6 views
1

私はオブジェクトへのいくつかのユニークなポインタのコンテナクラスを持っています。dequeの間のユニークなポインタの移動

私は今、それらの1つを持って、別のクラスで何かをして、別のクラスに引き渡す必要があります(ある時点で、それらをリサイクルしてコンテナに戻す必要があります)。

以下はコードの概要です。しかし、私は機能とユニークなポインタを移動するための正しい方法で混乱しています:

using uptrPod = unique_ptr<Pod>; 
using dqUptrPods = deque<uptrPods>; 

class Container { 
public: 
    Container() : 
     n_elements_(500) 
    { 
     for (auto i = 0; i < n_elements_; i++) { 
     free_pods_.push_back(uptrPod(new Pod())); 
    } 

    const uptrPod&& getPod() { 
     auto up_pod= std::move(free_pods_[0]); 
     free_pods_.erase(free_pods_.begin()); 
     return up_pod; 
    } 

    void returnPod(const uptrPod&& up_pod) { 
     free_pods_.push_back(up_pod); 
    } 

private: 
    long n_elements_; 
    dqUptrPods free_pods_; 
}; 

class PodTracker { 

    void addPod(const uptrPod&& up_pod) { dq_pods_.pushback(up_pod); } 
    dqUptrPods dq_pods_; 
}; 

class PodHandler { 

    void movePod() { 
     up_pod = std::move(container_->getPod()); 

     /// do stuff with pod 

     pod_tracker_->addPod(up_pod); 
    } 

    Container* container_; 
    PodTracker* pod_tracker_; 
}; 

私はエラーを取得しています:

cannot bind std::unique_ptr l value to const uptrPod&& { aka const std::unique_ptr &&

は、どのように私はクラス間のポインタの周りに手渡すことができますか?

答えて

4

パス/値によってstd::unique_ptrインスタンスを返す、と明示的にstd::moveを使用します。

uptrPod getPod() { 
    auto up_pod= std::move(free_pods_[0]); 
    free_pods_.erase(free_pods_.begin()); 
    return up_pod; 
} 

void returnPod(uptrPod up_pod) { 
    free_pods_.push_back(std::move(up_pod));   
} 

class PodTracker{ 
    void addPod(uptrPod up_pod) { dq_pods_.push_back(std::move(up_pod)); } 
    dqSptrPods dq_pods_; 
}; 

example on wandbox
void movePod() { 

    // `std::move` is not necessary here, as `getPod()` 
    // is already a temporary (rvalue) 
    auto up_pod = container_->getPod(); 

    /// do stuff with pod 

    pod_tracker_->addPod(std::move(up_pod)) ; 
} 

注あまり意味がありませんconst右辺値参照のこと - 右辺値参照。

The main purpose of rvalue references is to allow us to move objects instead of copying them. And moving the state of an object implies modification. As a result, the canonical signatures for the move constructor and the move assignment operator both take its argument as a non-const rvalue reference.

(から:"What are const rvalue references good for?"

+0

up_pod'は関係なく、それが完璧に動作しているよう – TartanLlama

+1

:)右辺値参照を入力するのかどうかのさらに左辺値である 'ことを説明する価値があるかもしれません...おかげで多くのヴィットリオ – chrise

関連する問題