У меня проблемы с пониманием использования умных указателей в качестве членов класса в 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...
}
Допустим, я хотел бы заменить указатели умными указателями. А 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
. Если нет, просто верните ссылку.