std::unique_ptr<Object> 和许多观众(对象*),这是好的设计吗?
std::unique_ptr<Object> and many viewers (Object*), is it good design?
说我想管理一个 Object
和 unique_ptr
的大师 class。但是,我处于许多其他 classes 需要使用此 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
而不是原始指针,以便他们进行检查。
无论如何,你不应该使用std::unique_ptr<Object> &
:观察者不应该关心对象的生命周期是如何保证的。
另外,这不会对原始指针增加任何内容:如果对象死了,那是因为它的所有者死了,所以 std::unique_ptr
也死了,并且引用是悬空的——回到第一个问题。
说我想管理一个 Object
和 unique_ptr
的大师 class。但是,我处于许多其他 classes 需要使用此 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
而不是原始指针,以便他们进行检查。
无论如何,你不应该使用std::unique_ptr<Object> &
:观察者不应该关心对象的生命周期是如何保证的。
另外,这不会对原始指针增加任何内容:如果对象死了,那是因为它的所有者死了,所以 std::unique_ptr
也死了,并且引用是悬空的——回到第一个问题。