将类中的方法作为参数传递

时间:2012-09-29 11:55:04

标签: c++

我有一个这样的课程

class Keyboard
{
public:
    Keyboard(void);
    ~Keyboard(void);
    void SetHook(HINSTANCE hInstance);
    LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
};


LRESULT CALLBACK Keyboard::keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    bool bControlKeyDown=0;
    bool caps = GetKeyState(VK_CAPITAL) < 0;

...

void Keyboard::SetHook(HINSTANCE hInstance)
{
    KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, Keyboard::keyboardHookProc, hInstance, NULL);
}

但声明

KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, Keyboard::keyboardHookProc, hInstance, NULL);

导致编译错误

Error   7   error C3867: 'Keyboard::keyboardHookProc': function call missing argument list; use '&Keyboard::keyboardHookProc' to create a pointer to member

如果我改为'&amp; Keyboard :: keyboardHookProc'也会出错,当我转向'(HOOKPROC)&amp; Keyboard :: keyboardHookProc'时也会出错

任何人请帮助

1 个答案:

答案 0 :(得分:2)

这是C-callbacks的常见错误。

Keyboard::keyboardHookProc必须是静态的。

[UPDATE]

如果要对Keyboard中的Keyboard对象进行操作,则必须找到其他方法将static Keyboard::keyboardHookProc对象提供给此静态方法。如果您有一个Keyboard,则可能使用singleton模式,如果没有,那么每个静态方法都必须有自己的Keyboard对象。

[UPDATE2]

将对象与全局函数链接的方法之一是通过模板对象引用。但这只适用于全局对象:

class Keyboard
{
public:
    Keyboard();
    ~Keyboard(void);
    LRESULT keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
};

LRESULT Keyboard::keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
}
// global function interface 
template <Keyboard& k>
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   return k.keyboardHookProc(nCode, wParam, lParam);
}


Keyboard k; // global keyboard

int main()
{
   // this works
   SetWindowsHookEx(0, keyboardHookProc<k>, NULL, NULL);
}