У мене виникають проблеми з розумінням використання смарт-покажчиків як членів класу в C ++ 11. Я багато читав про розумні покажчики і, думаю, я розумію, як unique_ptrі shared_ptr/ weak_ptrв цілому працювати. Що я не розумію, це справжнє використання. Схоже, всі рекомендують використовувати unique_ptrяк шлях, який потрібно пройти майже весь час. Але як би я реалізував щось подібне:
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...
}
Скажімо, я хотів би замінити покажчики на розумні покажчики. A unique_ptrне працював би через це getDevice(), правда? Так це час, коли я використовую shared_ptrі weak_ptr? Ніякого способу використання unique_ptr? Мені здається, що для більшості випадків shared_ptrмає більше сенсу, якщо я не використовую вказівник у дійсно невеликому обсязі?
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...
}
Це шлях? Дуже дякую!
shared_ptrце правильно у 8/10 випадків. Інші 2/10 розділені між unique_ptrі weak_ptr. Крім того, weak_ptrзазвичай використовується для розбиття кругових посилань; Я не впевнений, що ваше використання буде вважатися правильним.
deviceданих? Спочатку ви повинні вирішити це.
unique_ptrзамість цього і відмовитись від права власності під час виклику конструктора, якщо я знаю, що зараз він мені більше не потрібен. Але як дизайнер Settingsкласу, я не знаю, чи хоче абонент зберегти посилання. Можливо, пристрій буде використовуватися в багатьох місцях. Гаразд, можливо, саме в цьому ваша думка. У такому випадку я не був би єдиним власником, і тоді я б використовував shared_ptr. І: настільки розумні точки замінюють покажчики, але не посилання, правда?
deviceдо конструктораsettings, ви хочете все-таки мати можливість посилатися на нього в області виклику або лише черезsettings? Якщо остання,unique_ptrкорисна. Крім того , у вас є сценарій , в якому повертається значенняgetDevice()єnull. Якщо ні, просто поверніть посилання.