静态对象实例必须具有静态成员变量吗?

时间:2013-05-22 10:22:43

标签: c++ static-members static-variables

我编写了一个非常有效的事件处理程序机制。 所以我将它扩展为更通用化并编写了一个事件处理程序来给我键盘状态:

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变量包含一个表示键盘状态的数组(例如,每个键一个条目,bool变量表示keydown或keyup)。

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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