C ++事件系统 - 使用基于堆或堆栈的事件

时间:2012-11-15 14:26:57

标签: c++ design-patterns event-handling

我正在尝试设计一个简单的事件系统,“基本上”,看起来像这样:

  • 观察者实体保留了需要通知的所有对象的列表。它还存储一个已触发事件的队列。然后,事件由对象列表处理,iteratint通过此对象列表处理。
  • 一个对象保留一个它向其发送事件的观察者列表。从基础对象继承的每个特定对象都可以触发自己的专用事件(键,鼠标,碰撞等)。该对象还有一个方法HandleEvent(..),具有不同的重载用于编译时类型检测,而不是使用dynamic_casting

在触发事件时最好选择:在堆栈上创建它们并通过引用传递它们,或者在堆上动态分配它们并使用dynamic_casting并让观察者在它们被对象处理时解除分配它们可以处理吗? (例如,当事件可以经常被触发时,不需要动态分配;动态转换怎么样,是不是可以避免?)。

此外,这不是一个线程安全的场景..

1 个答案:

答案 0 :(得分:2)

您需要动态分配吗?通常,你想要

void fireEvent()
{
    Event ev;
    for ( each observer )
       observer.trigger(ev);
}

观察员的签名

void trigger(const Event& ev);

请注意,“传递对它们的引用”并非如此,迂腐地说。它实际上是“通过引用传递它们。”