【问题标题】:std::unique_ptr<Object> and many viewers (Object*), is it good design?std::unique_ptr<Object> 和许多观众(Object*),这是好的设计吗?
【发布时间】:2017-03-09 07:55:47
【问题描述】:

假设我想在某种大师班中管理Objectunique_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&lt;Object&gt;&amp; 而不是Object*

假设Gadget1 的生命周期保证比Worker 短。

【问题讨论】:

  • 设计不错。
  • 创建的“gadgets”的生命周期会小于“worker”的生命周期吗?然后就好了。将指针(尤其是智能指针)视为处理 ownership 您展示的设计是 Worker 拥有 指向的数据,并提供 non-owning 指向小工具数据的指针。如果您想要共享所有权,或者小工具的生命周期可能比 Worker 的生命周期长,那么请考虑使用 std:shared_ptr
  • @KerrekSB 我真的在写伪代码;不是真正的代码。我希望我不需要写Object 和工厂函数。所以我的问题是“从 unique_ptr 所有者那里提供Object*Object&amp; 是个好主意吗?”
  • 在依赖生命周期包含时我会非常小心,但原始指针绝对比对智能指针的引用更好。
  • @Nullptr:省略号很好。我更关心有关如何拼写成员函数和正确获取 unique_ptrs 的基本细节。我很确定您的意思是 obj_.get() 不是 obj_-&gt;get(),但很难猜到。

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


【解决方案1】:

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

如果您不能保证对象的寿命比观察者的寿命长,则:

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

无论如何,你都不应该使用std::unique_ptr&lt;Object&gt; &amp;:观察者不应该关心如何确保对象的生命周期。
另外,这并没有增加原始指针:如果对象死了,那是因为它的所有者死了,所以std::unique_ptr 也死了,引用悬空——回到第一格。

【讨论】:

  • "为所有者提供智能指针,为其他所有人提供原始指针。"你搞定了。谢谢!我想仔细检查一下这是否很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多