【发布时间】:2017-03-09 07:55:47
【问题描述】:
假设我想在某种大师班中管理Object 和unique_ptr。但是,我遇到了许多其他类需要使用这个Object 的情况。我将Object* 传递给他们。我不认为这是一个好的设计,但我找不到合适的解决方案。
class Gadget1 {
Object* obj_;
public:
Gadget1(Object* obj) : obj_(obj) {}
};
class Gadget2 {
// .. similar
};
class Worker {
std::unique_ptr<Object> obj_;
public:
void init() {
obj_ = std::make_unique<Object>(...);
createGadget1(obj_.get());
createGadget2(obj_.get());
...
}
};
什么是正确且安全的方法? Gadget 应该有unique_ptr<Object>& 而不是Object*?
假设Gadget1 的生命周期保证比Worker 短。
【问题讨论】:
-
设计不错。
-
创建的“gadgets”的生命周期会小于“worker”的生命周期吗?然后就好了。将指针(尤其是智能指针)视为处理 ownership 您展示的设计是
Worker拥有 指向的数据,并提供 non-owning 指向小工具数据的指针。如果您想要共享所有权,或者小工具的生命周期可能比Worker的生命周期长,那么请考虑使用std:shared_ptr。 -
@KerrekSB 我真的在写伪代码;不是真正的代码。我希望我不需要写
Object和工厂函数。所以我的问题是“从 unique_ptr 所有者那里提供Object*或Object&是个好主意吗?” -
在依赖生命周期包含时我会非常小心,但原始指针绝对比对智能指针的引用更好。
-
@Nullptr:省略号很好。我更关心有关如何拼写成员函数和正确获取 unique_ptrs 的基本细节。我很确定您的意思是
obj_.get()不是obj_->get(),但很难猜到。
标签: c++11 c++14 smart-pointers unique-ptr