Переместить конструктор для пользовательского контейнера?

0

является конструктором перемещения для класса, который содержит динамически выделенный массив, который должен удалить его? Например, у меня есть:

template<typename T>
class MyVector
{
public:
MyVector()
{
data = new T[32];
capacity = 32;
size = 0;
}

MyVector(const MyVector<T>& o) //The basic copy constructor
{
capacity = o.capacity;
size = o.size;
data = new T[capacity];

for(int i = 0; i < _size; i++)
{
data[i] = o.data[i];
}
}

MyVector(const MyVector<T>&& o) //The move constructor
{
//What goes here?
}

private:
T* data;
unsigned int size;
unsigned int capacity;
};

Я понимаю, что конструктор перемещения вызывается, когда я делаю что-то вроде:

MyVector A; A = MyVector(); // Тот, что справа, вызывает конструктор перемещения? То есть он должен быть идентичен конструктору копирования?

  • 0
    Вероятно, это просто одноразовое упражнение, но ваш Vector не будет работать с типами, которые не имеют конструктора по умолчанию. Реальные векторы не создают 32 новых T s при создании; они выделяют достаточно памяти для 32 T s, а затем позже заполняют эту память объектами по мере необходимости с помощью размещения нового.
Теги:
c++11
move-semantics
rvalue-reference

1 ответ

2
Лучший ответ

является конструктором перемещения для класса, который содержит динамически выделенный массив, который должен удалить его? Например, у меня есть:

Нечего удалять. Объект строится в конце концов. Все, что он должен делать, это взять ресурсы с объекта на RHS. Он должен оставить RHS в разумном состоянии. Например,

MyVector(MyVector<T>&& o)
{
    data = o.data;
    o.data = nullptr;

    capacity = o.capacity;
    o.capacity = 0;

    size = o.size;
    o.size = 0;
}

Обратите внимание, что для того, чтобы конструктор перемещения работал, параметр не может быть const. Конструктор перемещения изменяет свой аргумент.

  • 0
    о, вот так: MyVector (const MyVector <T> && o) // Конструктор перемещения {data = o.data; размер = o.size; емкость = o.capacity; o.data = null; o.capacity = null; o.size = null; }?
  • 0
    @shortage_radeon Я добавил пример. Должны соблюдаться инварианты типа, поэтому вам также нужно что-то делать с size и capacity .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню