1

假设您必须拥有对象具有不相关生命周期的 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 可能是一种选择——但它还没有标准化。

所以这是我的问题:我的想法是否错误?有没有更简单的设计?

4

0 回答 0