Oczywiście nie można po prostu wykonać przypisania std::unique_ptr
s, ponieważ ich operator przypisania został usunięty. Jest to zamierzone, aby zmusić programistę do zdefiniowania zachowania, które chce.
- Nowy przedmiot przejmuje na własność
c_
, unieważniając oryginalny przedmiot.
- Nowy element tworzy kopię
c_
, zachowując ważność oryginalnych elementów.
- Nowa pozycja dzieli własność na
c_
, dzięki czemu zarówno nowe, jak i oryginalne elementy odnoszą się do tego samego obiektu.
W przypadek 1 co szukasz jest konstruktorem ruch, a domyślny konstruktor ruch będzie działać prawidłowo. Więc nie trzeba pisać żadnego kodu, można po prostu zrobić:
A temp;
A foo(std::move(temp));
Zauważ, że temp
jest nieprawidłowy po jego przeniesienie.
W przypadek 2 trzeba dodać konstruktora zwyczaj kopiowania do A
aby utworzyć kopię oryginału c_
:
A(const A& a):c_(new C(*(a.c_))){}
Po zdefiniowaniu tego w A
można zrobić:
A foo(A());
Należy pamiętać, że zależy to od funkcjonalności konstruktora kopiowania C
.
W przypadek 3 trzeba zasadniczo zmienić A
z użyciem std::unique_ptr
do korzystania z std::shared_ptr
, więc definicja c_
staną:
std::shared_ptr<C> c_;
Twój budowa c_
byłyby identyczne co już używasz dla wersji std::unique_ptr
z. Więc po prostu przy użyciu domyślnych implementacje można zrobić:
A foo;
A bar(foo);
a teraz foo
i bar
wskazują na ten sam C
obiektu i podziel go na własność. Ten obiekt współdzielony nie zostanie usunięty, dopóki wszystkie odniesienia do niego nie zostaną usunięte.
Więc kiedy tworzysz kopię, chcesz unieważnić oryginał? Sugerowałbym usunięcie konstruktora kopiowania i uczynienie klasy ruchomą tylko. – NathanOliver
Jeśli z oryginałem masz na myśli oryginalny obiekt A yes, to powinno być "przeniesienieref" jako członek klasy B. Czy możesz podać przykład tego? – gcswoosh
@Gabrielecswoosh Poświęć trochę czasu na czytanie pytań/odpowiedzi na znaczniku [tag: move-semantics]. –