C++11 标准::唯一性\u ptr<;对象>;还有很多观众(Object*),这是好的设计吗?

C++11 标准::唯一性\u ptr<;对象>;还有很多观众(Object*),这是好的设计吗?,c++11,c++14,smart-pointers,unique-ptr,C++11,C++14,Smart Pointers,Unique Ptr,假设我想在一种主类中使用unique\u ptr管理一个对象。但是,我遇到的情况是,许多其他类都需要使用这个对象。我正在将对象*传递给他们。我认为这不是一个好的设计,但我找不到正确的解决方案 class Gadget1 { Object* obj_; public: Gadget1(Object* obj) : obj_(obj) {} }; class Gadget2 { // .. similar }; class Worker { std::unique_ptr&l

假设我想在一种主类中使用
unique\u ptr
管理一个
对象。但是,我遇到的情况是,许多其他类都需要使用这个
对象
。我正在将
对象*
传递给他们。我认为这不是一个好的设计,但我找不到正确的解决方案

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());
    ...
  }
};
1类{
对象*obj_;
公众:
Gadget1(Object*obj):obj(uj(obj){}
};
第2类{
//…相似
};
班主任{
std::唯一对象;
公众:
void init(){
obj_u=std::使_唯一(…);
createGadget1(obj.get());
createGadget2(obj.get());
...
}
};
什么是正确和安全的方法?
Gadget
是否应该具有
唯一性&
而不是
对象*


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

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

如果无法保证对象比观察者更长寿,请执行以下任一操作:

  • 当对象死亡时通知观察者,以便他们可以更新其原始指针,或
  • 为观察者提供
    std::weak_ptr
    s而不是原始指针,以便他们进行检查
在任何情况下,您都不应该使用
std::unique\u ptr&
:观察者不应该关心如何确保对象的生命周期。

另外,这在原始指针上没有添加任何内容:如果对象死了,那是因为它的所有者死了,所以
std::unique\u ptr
也死了,引用也挂起了——回到原点。

设计很好。创建的“小工具”的寿命会比“工作者”的寿命短吗?那就好了。将指针(尤其是智能指针)视为处理所有权,您展示的设计是
Worker
拥有指向的数据,并为小工具提供指向数据的非所有权指针。如果您希望共享所有权,或者小工具的寿命可能比 Works/Cuthor的寿命长,那么请考虑<代码> STD:SyrdYPPTR 。@ KerrekSB,我真的编写了一个伪代码;不是真正的代码。我希望我不需要编写
对象
和工厂函数。因此,我的问题是“从唯一的\u ptr所有者处提供
Object*
Object&
是否是个好主意?”在依赖生存期包含时,我会非常小心,但原始指针肯定比智能指针的引用好。@Nullptr:省略很好。我更关心的是关于如何拼写成员函数以及如何正确使用唯一ptr的基本细节。我很确定你的意思是
obj.get()
不是
obj->get()
,但这很难猜测。“为所有者提供智能指针,为其他所有人提供原始指针。”你做到了。谢谢我想再检查一下这是否好。