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