假设我想在某种类中使用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
。
答案 0 :(得分:3)
你的设计非常好:为所有者提供智能指针,为其他人提供原始指针。
如果你不能保证对象比观察者更长,那么:
std::weak_ptr
而不是原始指针,以便他们检查。无论如何,你不应该使用std::unique_ptr<Object> &
:观察者不应该关心如何确保物体的寿命。
另外,这对原始指针没有任何补充:如果对象死亡,那是因为它的所有者死了,所以std::unique_ptr
也死了,引用正在悬空 - 回到原点。