2017-02-23 80 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聯合「

我看不出爲什麼這兩個操作在功能上彼此不同。任何洞察爲什麼提取失敗和追加不會被讚賞,並且提取工作的一種方式將是更加如此。 (注:Vector這裏是std :: vector的自定義實現,因爲Reasons,但據我所知,它們的功能相同。如果這可能是問題,並且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_castdata_刪除const,但這不是最好的解決方案。也可以使用mutable關鍵字,但最好的解決方案是將您的函數聲明爲非const函數,因爲它正在修改對象內部狀態。

0

康斯坦斯,我猜。 'extract'從data_中刪除,所以不能是const。

相關問題