我在理解智能指针在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因为A 而无法使用getDevice(),对吧?那是我使用shared_ptrand的时候了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的情况下a 是正确的。其他2/10在unique_ptr和之间分割weak_ptr。另外,weak_ptr通常用于中断循环引用;我不确定您的用法是否正确。
device数据成员拥有什么所有权?您首先必须决定。
unique_ptr代替,并在调用构造函数时放弃所有权,如果我知道现在不再需要它的话。但是作为Settings该类的设计师,我不知道调用方是否也想保留引用。也许该设备将在许多地方使用。好吧,也许这正是您的意思。在那种情况下,我不会是唯一的所有者,我猜那是我将使用shared_ptr的时候。而且:如此聪明的点确实可以代替指针,而不是引用,对吗?
device给的构造函数后settings,您是否仍然希望能够在调用范围内或仅通过settings?如果是后者,unique_ptr则很有用。另外,您是否有返回值为的getDevice()情况null。如果没有,请返回参考。