2016-09-27 43 views
12

Chcę wyjaśnić, że konstruktor mojej klasy A przejmie na własność przekazany parametr Data. Oczywistą rzeczą do zrobienia jest wziąć unique_ptr o wartości:Przejmij własność parametru według wartości r-odniesienia

class A 
{ 
public: 
    A(std::unique_ptr<Data> data) : _data(std::move(data)) { } 

    std::unique_ptr<Data> _data; 
}; 

Jednak dla mojego użytku przypadku, nie ma powodu, dlaczego Data powinien być wskaźnikiem, ponieważ typ wartości wystarczy. Jedyne opcja, że ​​mogę myśleć, aby naprawdę jasne, że Data będzie własnością A jest podanie przez rvalue-reference:

class A 
{ 
public: 
    A(Data&& data) : _data(std::move(data)) { } 

    Data _data; 
}; 

Czy jest to prawidłowy sposób sygnalizować własność lub są tam lepsze opcje, aby to zrobić bez użycia unique_ptr?

+0

Dlaczego ctor bierze na siebie odpowiedzialność? –

+2

Wyjaśniłbym konstruktorowi –

+1

@IvanRubinson Z różnych powodów, takich jak Dependency Injection. –

Odpowiedz

4

Tak, uważam, że jest to ważny sposób.

W przypadku unique_ptr, nie można jej kopiować, więc nie ma niebezpieczeństwa, że ​​ktoś przypadkowo wykona kopię, gdy nie zamierzają, więc zarówno wartość przekazana, jak i wartość r-pass oznaczają przejmowanie własności.

W przypadku dokumentów Data, dokumenty referencyjne, które przejmujesz, są własnością i nie ma niebezpieczeństwa, że ​​osoba dzwoniąca przypadkowo wykona kopię, gdy nie zamierzała.

2

Tak, jest to ważny sposób. Można go również przekazać według wartości:

class A { 
    A(Data data) : _data(std::move(data)) { } 
}; 
Data data; 
A a(std::move(data)); 
+2

Oczywiście jest to również opcja. Nie wymusza to jednak przesuwania obiektu, dlatego można wykonać niepotrzebne kopie. –

+2

@angelag W tym przypadku myślę, że wartością dodaną może być lepsza opcja. Jeśli chcesz, aby 'Dane' zawsze miał tylko JEDNEGO właściciela, powinieneś uczynić go niekopiowalnym i przekazać' Dane' według wartości działa tak, jak zrobiłeś to z 'unique_ptr'. W przeciwnym razie, tj. 'Dane' jest kopiowalna, wartość przekażnika daje klientowi dwie możliwości: skopiować lub" przenieść ". Jest bardziej elastyczny i czasami klient może chcieć zachować kopię 'Danych' po przekazaniu jej do konstruktora' A'. –