将事件对象存储为成员或shared_ptr

时间:2019-05-15 20:05:34

标签: c++ events memory design-patterns observer-pattern

我有一个事件对象,该对象应该是类的成员:

class Foo
{
public:
    Event event_;
}

函数可以订阅此事件并在事件上调用invoke时被调用:

Foo * foo = new Foo();
Event & event_ = foo->event_;
int id = event_.Subscribe(*some std::function<void()>*);
event_.Invoke();

// a lot of stuff happens until we no longer need to be subscribed to the event

event_.Unsubscribe(id);

现在,让我们假定在出于任何原因取消订阅之前删除了该对象foo。为了防止这种情况,我可以将事件设置为shared_ptr。

class Foo
{
public:
    std::shared_ptr<Event> event_;
}

从概念上讲这是错误的吗?如果设计良好,是否可以在销毁对象之前永远不会取消订阅?我是否通过将它设置为shared_ptr来隐藏潜在的错误/内存泄漏?还是这种好习惯?

面向所有对c ++中的完整event-system感兴趣的人。

0 个答案:

没有答案