首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这是一个好的设计选择吗?

这是一个好的设计选择吗?
EN

Stack Overflow用户
提问于 2012-12-14 06:47:40
回答 2查看 105关注 0票数 1

我正在用OpenGL编写一个程序,将会有一些自定义事件将要发生,例如。当球员碰到障碍物或迈出一步时。我想做的是:

有一个名为“EventBroadcaster”的单例类。广播员将收到来自节目周围的事件。然后,当它接收到一个事件时,它会将它发送给所有的侦听器("EventListener“对象),其中包含一个包含事件信息的结构。然后,EventListener对象可以使用自己的自定义回调函数来处理不同类型的事件。现在,如果可能的话,我想避免使用void,所以...

...question是,我如何使用模板接口来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-14 07:47:13

将所有内容转换为void*然后再转换回来很容易出错。看看boost::signals或一些other信号/槽库。它可能会帮助您避免丢弃类型信息。

类可以公开一个槽,然后调用它。例如,可能有一个像void PlayerMovedTo( Point position )这样的插槽。其他类可以连接到该插槽,并在发送信号时收到通知。

以下是信号/插槽机制的一般工作原理的粗略描述:

代码语言:javascript
代码运行次数:0
运行
复制
class Game {
public:
  Signal<void (float, float)> PlayerMovedTo;

  void update() {
    if ( downKeyPressed ) {
       y += 10;
       PlayerMovedTo( x, y ); // Tell everyone about it
    }
  }
};


class Mine {
public:
  Mine() {
    // There can be many mines, all connected to the one signal.
    game.PlayerMovedTo.connect( this, &Mine::playerMoved );
  }

  void playerMoved( float x, float y ) {
    if ( distance( this->x, this->y, x, y ) < 10 ) {
      boom();
    }
  }
}; 
票数 1
EN

Stack Overflow用户

发布于 2012-12-14 07:30:57

如果您想要做的就是避免因为使用空指针而丢弃类型信息,那么您可能需要查看boost::any

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13869875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档