我正在将(至少)我的一些代码转换为使用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() {}
};
答案 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
。请注意,这对模型的构造函数有一些限制。