2015-09-24 26 views
11

Mam klasy foo, z członkiem bar typu std::shared_ptr<int>:Przypisanie do std :: shared_ptr członek zmiennej

class foo 
{ 
    std::shared_ptr<int> bar; 
    /*other stuff here*/ 
}; 

W tej klasie I chcesz przypisać do barnew int. Ale nie mogę napisać bar = new int();, ponieważ wskaźnik nie ma publicznego operatora przypisania.

Jak powinien Robię to? Mogłem std::move lub std::swap, ale żaden z nich nie wydaje się odpowiedni.

Odpowiedz

10

Można użyć do tego reset:

bar.reset(new int()); 

Będzie delete aktualną zawartość (jeśli istnieje) i ustawić wewnętrzny wskaźnik do zwrócony przez wyrażenie new.

13

bar = std::make_shared<int>(); jest jednym ze sposobów, szczególnie jeśli chcesz zachować zdolność do obsługiwania operatora przypisania.

+0

Zobaczyłem zmianę. Czy to się zmienia, inicjalizując 'int' na 0? 'new int()' would, 'new int' would not. – Bathsheba

+2

'std :: make_shared (new int())' jest nieprawidłowe; 'make_shared' perfect - przekazuje argumenty do konstruktora' T'. Określono, aby skonstruować obiekt za pomocą ':: new (pv) T (std :: forward (args) ...), więc jeśli nie będzie żadnych argumentów, zostanie zainicjalizowana wartość. – TartanLlama

+1

@Bathsheba: Tak, nie ma "niezainicjowanych" form żadnej z funkcji 'make_ *'. Myślę, że coś takiego zostało zaproponowane tylko raz (jako część propozycji pozwalającej na uwzględnienie rozmiarów typów tablic dla make_ {shared, unique}), a propozycja została dostarczona z niezainicjowaną formą make _ * _, która używa domyślnej inicjalizacji. Ogólnie rzecz biorąc, standardowa biblioteka sprawia, że ​​tworzenie niezainicjowanych wartości jest bardzo trudne, nawet jeśli czasami tego właśnie potrzebujesz ... –

Powiązane problemy