У мене виникають проблеми з розумінням використання смарт-покажчиків як членів класу в 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
. Якщо ні, просто поверніть посилання.