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_ptri shared_ptr/ weak_ptrdziała ogólnie. To, czego nie rozumiem, to prawdziwe użycie. Wygląda na to, że wszyscy zalecają używanie unique_ptrgo 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_ptrnie zadziała z powodu getDevice(), prawda? Więc to jest czas, kiedy używam shared_ptri weak_ptr? Nie ma możliwości korzystania unique_ptr? Wydaje mi się, że w większości przypadków shared_ptrma 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_ptrjest poprawne w 8/10 przypadków. Pozostałe 2/10 są podzielone między unique_ptri weak_ptr. Jest również weak_ptrogólnie używany do przerywania odwołań cyklicznych; Nie jestem pewien, czy twoje użycie zostanie uznane za prawidłowe.
deviceczłonka danych? Najpierw musisz o tym zdecydować.
unique_ptrzamiast 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 Settingsklasy 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?
devicedo 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_ptrjest przydatne. Ponadto, czy masz scenariusz, w którym wartość zwracanagetDevice()tonull. Jeśli nie, po prostu zwróć odwołanie.