std::unique_ptr<Object>和许多观众(对象*),这是好的设计吗?



说我想在某种主类中使用unique_ptr管理Object。但是,我处于许多其他类都需要使用此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

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

如果您不能保证对象要比观察者组成:

  • 在对象死亡时通知观察者,以便他们可以更新原始指针,或者
  • std::weak_ptr S代替原始指针给观察者,以便他们可以检查。

在任何情况下,您都不应使用std::unique_ptr<Object> &:观察者不应该关心如何确保对象的寿命。
另外,这对原始指针没有任何添加:如果对象死亡,那是因为其所有者死了,所以std::unique_ptr也死了,参考文献是悬挂的 - 返回正方形。

相关内容

  • 没有找到相关文章

最新更新