Реализовать конструктор перемещения с вектором указателей - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть вектор указателей в моем классе:

std::vector<Customer *> customers

Теперь я хочу реализовать конструктор перемещения.Я узнаю, что могу использовать std::move из std::vector.проблема в том, что я не знаю, удалит ли он старые значения вектора.пожалуйста, если кто-нибудь может мне это объяснить.

мой конструктор ходов:

OpenTable::OpenTable(OpenTable&& other) : BaseAction(), tableId(other.tableId)
{
    customers=std::move(other.customers);
}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Ваш конструктор ходов будет делать то, что вы хотите, не нужно ничего очищать

После std::move() 'из std::vector старый вектор будет иметь 0 элементов и для него не будет выделена динамическая память. Недавно построенный вектор забирает эту память. Нет необходимости очищать какие-либо элементы.

Однако следует также сказать, что:

У меня есть вектор указателей в моем классе:

Это ошибка ... мы больше не используем C ++ 98. Необработанные указатели не указывают, кому принадлежит память, а также срок жизни объекта по адресу. Теперь вы можете понять это правильно, но вы не можете. А как насчет будущего разработчика вашего кода? Лучше не оставлять это на волю случая: вместо этого используйте умный указатель . Или - просто поместите фактические объекты в вектор. Как показывают комментарии, если вы перемещаете, а не копируете вектор, вы не будете делать дополнительные копии тех же объектов.

Подробнее об этом можно узнать в разделе Управление ресурсами в Руководстве по программированию C ++ Core .

0 голосов
/ 13 ноября 2018

проблема в том, что я не знаю, удалит ли он старые значения вектора.

Вектор гарантированно будет пустым после того, как он был перемещен из.

customers=std::move(other.customers);

Вместо того, чтобы по умолчанию создавать элемент, а затем перемещать и назначать его, лучше перемещать-создавать элемент непосредственно в списке инициализации элемента:

OpenTable::OpenTable(OpenTable&& other) : ..., customers(std::move(other.customers))

Хотявыглядит так, будто ваш конструктор не делает ничего отличного от неявного конструктора перемещения, поэтому вы можете использовать вместо него:

OpenTable::OpenTable(OpenTable&&) = default;

Еще лучше, в зависимости от остальной части вашего класса, конструктор перемещения можетбыть объявленным неявно, так что вам может даже не понадобиться это объявление по умолчанию.

...