0

我编写了一个运行良好的事件处理程序机制。所以我将它扩展为更通用并编写了一个事件处理程序来给我键盘状态:

class KeybdHandler : public EventHandler<KeybdHandler>
{
private:
    Keyboard    _keybd;

public:
    void SetEvent( const Keyboard::KeyEvent & evt )
    {
        Keyboard::KeyEvent e = evt;

        // event holds the new keystate
        Notify(&e);

        // keystate is saved to keyboard
        _keybd.SetKey(e._Key, e._bKeyDown);
    }

    Keyboard & GetKeybd() { return _keybd; }
};

static KeybdHandler g_evtKeybd;

KeybdHandler::Keyboard 变量包含一个表示键盘状态的数组(例如,每个键一个条目和表示 keydown 或 keyup 的 bool 变量)。

所以我创建了这个 KeybdHandler 类的静态实例。

但是当我调用 g_evtKeybd.GetKeybd() 时,键盘状态始终为空/空白/全部处于 keyup 状态。

当我将 KeybdHandler::Keyboard 变量设为静态时,GetKeybd() 返回一个已保存状态的键盘对象。

如果包含对象是静态的,为什么 Keyboard 变量必须是静态的?

编辑:只是想澄清 SetEvent 总是通过静态变量调用:

g_evtKeybd.SetEvent( Keyboard::KeyEvent((int)key, true));

EDIT2:我不确定它是否相关。KeybdHandler 类位于静态库中,并链接到另一个可执行文件。

4

1 回答 1

1

您声明g_evtKeybd为全局静态变量。在这种情况下static有不同的含义。每个编译单元都有自己的实例,g_evtKeybd可能不是您想要的。由于静态成员由类的所有实例共享,因此所有实例都将返回相同的值,即使您有多个实例(隐藏您的实际错误)。

于 2013-05-22T10:55:01.540 回答