2017-02-23 57 views
3

У меня есть класс, который имеет вектор объектов. Объекты, о которых идет речь, удалили конструкторы копирования и операторы присваивания копий, и, следовательно, у них есть конструктор перемещения и оператор перемещения, чтобы они могли использоваться с векторами. Этот класс, который содержит объекты, имеет методы добавления и извлечения, которые позволяют добавлять объекты в вектор объекта объекта из буфера или извлекать из вектора объекта класса в буфер.Может перемещать объект из вектора 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; 
    } 
}; 

Методы Append компиляции:

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 unction "

Не могу понять, почему эти две операции функционально отличаются друг от друга. Любое понимание того, почему извлечение не удается и добавление, не будет оценено, и способ сделать работу с экстрактом будет еще более.

(Примечание: Вектор здесь представляет собой пользовательскую реализацию std :: vector, поскольку причины, но насколько мне известно, они работают одинаково. Если это потенциально проблема, а std :: vector будет в порядке с добавлением/извлечением, поскольку они стоят, я думаю, я посмотрю, будет ли это использовать.)

+0

Что такое выход компилятора? – Aeonos

+1

Вы делаете это из метода 'const'? Интересно ... Если метод const, то таким образом должен быть выбран 'operator []' для 'data_', не так ли? – WhozCraig

+0

@Aeonos C2280 'MyObject :: MyObject (const MyObject &)': попытка ссылки на удаленную функцию – ELRG

ответ

3

extract - функция-член const и в функции-член-константа каждая ссылка на переменные-члены являются константами. Когда вы получаете доступ к data_[i], возвращаемый тип данных - const MyObject&.

std::move просто бросить его на вход эталон г-значение и в вашем случае типа возвращаемого std::move является const MyObject&&, а потому, что объект имеет const спецификатора выбранные перегрузки для push_back будут push_back(const T&).

Вы можете использовать const_cast, чтобы удалить const из data_, но это не лучшее решение. Также может использоваться ключевое слово mutable, но лучшим решением является объявить вашу функцию как функцию не-const, потому что она изменяет внутреннее состояние объекта.

0

Constness, я думаю. «extract» удаляется из data_, поэтому не может быть const.

Смежные вопросы