我很难理解智能指针在C++11中作为类成员的用法。我读过很多关于智能指针的文章,我想我确实了解
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...
}
让我们说我想用智能指针替换指针。因为
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...
}
这条路走吗?谢谢!
因为
不,不一定。这里重要的是为您的
它将单独成为
在第一种情况下,
在这种假设下,
#include <memory>
class Device {
};
class Settings {
std::unique_ptr<Device> device;
public:
Settings(std::unique_ptr<Device> d) {
device = std::move(d);
}
Device* getDevice() {
return device.get();
}
};
int main() {
std::unique_ptr<Device> device(new Device());
Settings settings(std::move(device));
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
[注1:您可能会想知道为什么我在这里使用原始指针,当每个人都在说原始指针是坏的,不安全的和危险的。实际上,这是一个非常宝贵的警告,但重要的是把它放在正确的上下文中:原始指针用于执行手动内存管理(即通过
[注2:正如评论中所指出的,在所有权是唯一的并且所拥有的物体总是保证存在的这种特殊情况下(即:在所有人的财产中,所有人的财产都是唯一的),所有人的财产都是唯一的。内部数据成员
当然,如果您的
这是只有作为程序设计者的您才能知道的事情;从你提供的例子中,我很难分辨事实是否如此。
为了帮助您弄清问题,您可以问问自己,除了
#include <memory>
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> const& d) {
device = d;
}
std::shared_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device = std::make_shared<Device>();
Settings settings(device);
// ...
std::shared_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
请注意,
与常规原始指针相比,
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(const std::shared_ptr<Device>& device) : device(device) {
}
const std::shared_ptr<Device>& getDevice() {
return device;
}
};
int main()
{
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::shared_ptr<Device> myDevice(settings.getDevice());
// do something with myDevice...
return 0;
}