Очевидно, что вы не можете просто сделать уступку std::unique_ptr
с, как их оператор присваивания удаляется. Это преднамеренно заставить программиста определить поведение, которое он хочет.
- Новый предмет принадлежит
c_
, недействительный оригинал.
- Новый товар делает копию
c_
, сохраняя при этом подлинность оригинала.
- Новый элемент владеет долей
c_
, так что и новые, и оригинальные элементы ссылаются на один и тот же объект.
В случае 1 то, что вы ищете, является шагом конструктор и конструктор двигаться по умолчанию будет работать нормально. Так что вам не нужно писать код, вы можете просто сделать:
A temp;
A foo(std::move(temp));
Обратите внимание, что temp
является недействительным после его перемещения.
В случае 2 вам нужно добавить конструктор пользовательских копий в A
создать копию оригинала c_
:
A(const A& a):c_(new C(*(a.c_))){}
После определения этого в A
вы можете сделать:
A foo(A());
Обратите внимание, что это зависит от конструктора копии C
, являющегося функциональным.
В случае 3 вам необходимо коренным образом изменить A
с помощью std::unique_ptr
с помощью std::shared_ptr
, поэтому определение c_
стало бы:
std::shared_ptr<C> c_;
Ваше строительство c_
будет идентичен что вы уже используете для версии std::unique_ptr
версии c_
. Таким образом, только с помощью реализации по умолчанию вы можете сделать:
A foo;
A bar(foo);
А теперь foo
и bar
указывают на то же C
объекта и долевой собственности его. Этот общий объект не будет удален до тех пор, пока все ссылки shared_ptr
s не будут удалены.
Итак, когда вы делаете копию, вы хотите сделать оригинал недействительным? Я бы предложил удалить конструктор копирования и сделать класс только движимым. – NathanOliver
Если с оригиналом вы имеете в виду исходный объект A, да, он должен быть «transferref» в качестве члена класса B. Можете ли вы привести пример этого? – gcswoosh
@Gabrielecswoosh Проведите некоторое время, прочитав вопросы/ответы по тегу [tag: move-semantics]. –