std :: unique_ptr <object>和很多观众(Object *),它的设计好吗?

时间:2017-03-09 07:55:48

标签: c++11 c++14 smart-pointers unique-ptr

假设我想在某种类中使用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

1 个答案:

答案 0 :(得分:3)

你的设计非常好:为所有者提供智能指针,为其他人提供原始指针。

如果你不能保证对象比观察者更长,那么:

  • 当对象死亡时通知观察者,以便他们可以更新其原始指针,或
  • 给观察者提供std::weak_ptr而不是原始指针,以便他们检查。

无论如何,你不应该使用std::unique_ptr<Object> &:观察者不应该关心如何确保物体的寿命。
另外,这对原始指针没有任何补充:如果对象死亡,那是因为它的所有者死了,所以std::unique_ptr也死了,引用正在悬空 - 回到原点。