gpt4 book ai didi

C++ 观察者模式 : raw pointers vs shared_ptr?

转载 作者:行者123 更新时间:2023-11-30 02:07:22 24 4
gpt4 key购买 nike

我正在(至少)将我的一些代码转换为使用 shared_ptr。但是,我遇到了我正在使用的观察者模式的问题。

我有一个演示器类(模型 View 演示器),它实现了观察者模式,并在某些事件发生时得到通知。我编写了任何类都可以继承的通用 Subject/Observer 类。更新方法看起来像这样:

void MyPresenter::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}

}

在我将 myService_(MyPresenter 类的成员)转换为 std::shared_ptr 之前,它工作正常。现在表达式 (subject == myService_) 不再有效。

我最终可能会将所有内容都转换为 shared_ptr,但在那之前是否有一种简单的方法可以让我通过观察者模式同时支持原始指针和 shared_ptr?理想情况下,我希望观察者模式与观察者的指针实现无关,但也许这是不可能的。我该如何解决这个问题?

更新

观察者模式观察者接口(interface)应该采用共享指针吗?还是将其保留为原始指针更好?目前我有:

class Subject;

class Observer
{
public:
virtual ~Observer() {}
virtual void Update(Subject *subject) = 0;

protected:
Observer() {}
};

最佳答案

要使这个工作正常,myService_ 和 subject 需要是 shared_ptr。否则,如果 subject 和 shared_ptr 指向同一个对象,您可以尝试像这样进行比较。

  subject == myService_.get()

否则尝试将所有指针更改为 shared_ptr。

关于C++ 观察者模式 : raw pointers vs shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com