【问题标题】:Is This a Good Design Choice?这是一个好的设计选择吗?
【发布时间】:2012-12-13 22:47:40
【问题描述】:

我正在用 OpenGL 编写一个程序,并且会发生一些自定义事件,例如。当玩家撞到障碍物或迈出一步时。我想做的是:

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

...问题是,如何使用模板界面做到这一点?

【问题讨论】:

标签: c++ templates void-pointers


【解决方案1】:

如果您只想避免因为使用 void 指针而丢弃类型信息,您可能需要查看boost::any

【讨论】:

    【解决方案2】:

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

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

    下面是信号/槽机制一般如何工作的粗略草图:

    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();
        }
      }
    }; 
    

    【讨论】:

    • 这是一个干净的模板化解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2010-09-24
    相关资源
    最近更新 更多