2017-02-23 79 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。

相关问题