2017-02-23 16 views
3

私は、オブジェクトのベクトルを持つクラスを持っています。問題のオブジェクトはコピーコンストラクタとコピー代入演算子を削除しているので、ベクトルで使用できるように移動コンストラクタと移動代入演算子があります。オブジェクトを保持するこのクラスは、オブジェクトをバッファからクラスのオブジェクトベクトルに追加するか、クラスのオブジェクトベクトルからバッファに抽出することを可能にするappendメソッドとextractメソッドを持っています。オブジェクトをベクトルAからベクトルBに移動できますが、BからAに移動することはできませんか?

オブジェクト定義は次のようになります。

struct MyObject 
{ 
    int width_ = 0; 
    int height_ = 0; 
    //etc... 

    stImage() = default; 

    stImage(int width, int height, ...) 
    { 
     width_ = width; 
     height_ = height; 
     //etc... 
    } 

    stImage(const stImage& rhs) = delete; 

    stImage& operator= (const stImage & rhs) = delete; 

    stImage(stImage&& rhs) : width_(0), height_(0), ... 
    { 
     *this = std::move(rhs); 
    } 

    stImage& operator=(stImage&& rhs) 
    { 
     if (this != &rhs) 
     { 
      width_ = rhs.width_; 
      height_ = rhs.height_; 
      //etc... 

      rhs.width_ = 0; 
      rhs.height_ = 0; 
      //etc... 
     } 
     return *this; 
    } 
}; 

アペンド方法はコンパイル:

void MyClass::append(MyObject * buffer) 
{ 
    data_.push_back(std::move(*buffer)); 
} 

void MyClass::append(Vector<MyObject> * buffer) 
{ 
    for (int i = 0; i < (*buffer).size(); i++) 
    { 
     data_.push_back(std::move((*buffer)[i])); 
    } 
} 

はしかし、抽出方法はない:

void MyClass::extract(it8 start, Length length, Vector<MyObject> * buffer) const 
{ 
    for (it8 i = start; i < (start + length); i++) 
    { 
     (*buffer).push_back(std::move(data_[i])); 
    } 
} 

与えられたエラーがあります」 C2280 'MyObject :: MyObject(const MyObject &)':削除されたfを参照しようとしています

なぜこれらの2つの操作が機能的に異なるのかわかりません。抽出が失敗して追加する理由についての洞察は理解できず、抽出作業を行う方法はさらにそうです。

(注:ベクトルはstd :: vectorのカスタムインプリメンテーションです。理由は同じですが、私が知っている限り、それらは同じ機能を果たします。これが潜在的に問題であり、std :: vectorは問題ありません彼らが立っているので、私はそれを使うのが良いかどうか分かります)。

+0

コンパイラの出力は何ですか? – Aeonos

+1

これは 'const'メソッドからやっていますか?興味深い...メソッドがconstの場合、 'data_'に対して' operator [] 'が選択されます。 – WhozCraig

+0

@Aeonos C2280 'MyObject :: MyObject(const MyObject&)':削除された関数を参照しようとしています – ELRG

答えて

3

extractはconstメンバ関数であり、constメンバ関数では、メンバ変数へのすべての参照はconstです。 data_[i]にアクセスすると、返されるデータ型はconst MyObject&になります。

std::moveはちょうどそれがr値の参照に入力だと、あなたのケースでstd::moveの戻り値の型がconst MyObject&&ですが、オブジェクトがconst修飾子を持っているのでpush_backのため選ばれた過負荷がpush_back(const T&)になりますキャスト。

const_castを使用してconstdata_から削除できますが、これは最適な解決策ではありません。また、mutableキーワードを使用することもできますが、オブジェクトの内部状態を変更しているため、関数を非const関数として宣言することをお勧めします。

0

コンストレス、そうです。 'extract'はdata_から削除されるため、constにすることはできません。

関連する問題