3

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

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

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

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

4

1 回答 1

2

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

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

以及观察者的签名

void trigger(const Event& ev);

请注意,从迂腐的角度来说,“传递对它们的引用”是不正确的。它实际上是“通过引用传递它们”。

于 2012-11-15T14:32:37.820 回答