c ++观察者模式:原始指针vs shared_ptr?

时间:2011-10-31 23:12:24

标签: c++ pointers shared-ptr observer-pattern

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

我有一个演示者类(Model View Presenter),它实现了Observer模式,并在某些事件发生时得到通知。我编写了任何类都可以继承的通用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,但在此之前,我是否有一种简单的方法可以支持原始指针和带有Observer模式的shared_ptr?理想情况下,我希望观察者模式与观察者的指针实现无关,但也许这是不可能的。我该如何解决这个问题?

更新

观察者模式Observer接口应该采用共享指针吗?或者将它作为原始指针更好?目前我有:

class Subject;

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

protected:
    Observer() {}
};

3 个答案:

答案 0 :(得分:3)

为了使这个工作,myService_和subject需要是shared_ptr。否则,如果subject和shared_ptr指向同一个对象,你可以尝试比较它。

  subject == myService_.get()

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

答案 1 :(得分:1)

你可以使用shared_ptr的get成员,它返回shared_ptr包裹的原始指针:

subject == myService_.get()

一般情况下,我不建议盲目地将所有原始指针转换为shared_ptr s。你总是要考虑周围的对象是否真的拥有指向的对象(并且共享所有权仍然是所有权)。有时一个std::unique_ptr(虽然我不知道tr1是否已经有了这个,否则std::auto_ptr)是更好的选择,如果它是严格的所有权或者只是一个原始指针,如果它不是所有权。

但是在接口中,特别是函数参数和返回值,原始指针通常比使用智能指针更好,因此降低了通用性(以及性能,虽然只是微不足道,但对于shared_ptr来说更是如此。 )。

注意:我知道这与现有答案的答案相同,但我绝对觉得有必要不要建议在所有地方使用shared_ptr

答案 2 :(得分:0)

为什么不简单地让模型继承自std::enable_shared_from_this。如果所有权共享,则可以从模型的(可能是虚拟的)方法返回shared_from_this。请注意,这对模型的构造函数有一些限制。