Mam problem ze zrozumieniem użycia inteligentnych wskaźników jako członków klasy w C ++ 11. Dużo czytałem o inteligentnych wskazówkach i myślę, że rozumiem, jak unique_ptr
i shared_ptr
/ weak_ptr
działa ogólnie. To, czego nie rozumiem, to prawdziwe użycie. Wygląda na to, że wszyscy zalecają używanie unique_ptr
go prawie cały czas. Ale jak bym zaimplementował coś takiego:
class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
Powiedzmy, że chciałbym zastąpić wskaźniki inteligentnymi wskazówkami. A unique_ptr
nie zadziała z powodu getDevice()
, prawda? Więc to jest czas, kiedy używam shared_ptr
i weak_ptr
? Nie ma możliwości korzystania unique_ptr
? Wydaje mi się, że w większości przypadków shared_ptr
ma to większy sens, chyba że używam wskaźnika w naprawdę małym teleskopie?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
Czy to jest droga? Dziękuję bardzo!
shared_ptr
jest poprawne w 8/10 przypadków. Pozostałe 2/10 są podzielone między unique_ptr
i weak_ptr
. Jest również weak_ptr
ogólnie używany do przerywania odwołań cyklicznych; Nie jestem pewien, czy twoje użycie zostanie uznane za prawidłowe.
device
członka danych? Najpierw musisz o tym zdecydować.
unique_ptr
zamiast tego użyć a i zrezygnować z własności podczas dzwonienia do konstruktora, jeśli wiem, że na razie nie będę go już potrzebować. Ale jako projektant Settings
klasy nie wiem, czy dzwoniący również chce zachować odniesienie. Może urządzenie znajdzie zastosowanie w wielu miejscach. Ok, może to jest dokładnie twój punkt widzenia. W takim przypadku nie byłbym jedynym właścicielem i chyba wtedy użyłbym shared_ptr. A więc: inteligentne punkty zastępują wskaźniki, ale nie odniesienia, prawda?
device
do konstruktora programusettings
, czy nadal chcesz móc odwoływać się do niego w zakresie wywołującym, czy tylko za pośrednictwemsettings
? Jeśli to drugie,unique_ptr
jest przydatne. Ponadto, czy masz scenariusz, w którym wartość zwracanagetDevice()
tonull
. Jeśli nie, po prostu zwróć odwołanie.