假设您必须拥有对象具有不相关生命周期的 A 和 B 类:
class A
{
public:
IStateChanger& GetStateChanger() { return mStateChanger; }
private:
StateChanger mStateChanger;
};
class B
{
public:
void Register(IStateChanger& iStateChanger)
{
mpStateChanger = &iStateChanger;
}
void Notify()
{
mpStateChanger->DoSomething();
}
private:
IStateChanger* mpStateChanger;
};
有一次,我在 B 的对象上注册了一个从 A 对象获得的 StateChanger。现在 A 死了,销毁了它自己的 StateChanger。但是 B 在 StateChanger 上活着并调用了一个方法,因为它认为它还活着。我的目标是使 Notify() 方法尽可能健壮。
当然,我们可以编写一些自动注册/注销观察者。这对我来说似乎有很多开销。
或者传递一个weak_ptr,这意味着在IA 对象上创建StateChanger 作为shared_ptr。而且,我需要有一个额外的方法来返回 IA 的 weak_ptr 而不是引用,当有人直接使用 A 时,这很难看。
或者,我可以写一个关于如何正确使用 API 的评论,并且在 B 处取消注册 StateChanger 的情况下杀死 IA 是邪恶的。这肯定会导致崩溃。
根据我的阅读,observer_ptr 可能是一种选择——但它还没有标准化。
所以这是我的问题:我的想法是否错误?有没有更简单的设计?