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

标签 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

如果我更改为“&Keyboard::keyboardHookProc”,它也会出错,当我转换为“(HOOKPROC) &Keyboard::keyboardHookProc”时,它也会出错

请大家帮忙

最佳答案

这是 C 回调的常见错误。

Keyboard::keyboardHookProc必须是静态的。

[更新]

您必须找到其他方法来获取 Keyboard如果您想对 Keyboard 进行操作,请反对此静态方法static Keyboard::keyboardHookProc 中的对象。如果您有 Keyboard您可以使用singleton模式,如果不是,那么每个静态方法都必须有自己的 Keyboard目的。

[更新2]

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

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

关于c++ - 将类中的方法作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652493/

相关文章:

c++ - 如果语句导致循环没有完全运行? C++

C++:初始化列表+模板产生奇怪的错误

c++ - 性能:一次做所有事情,还是每个操作循环几次?

c++ - 使用继承的类模板避免公共(public)成员不可见和源代码膨胀/重复的更好方法?

c++ - 十六进制的 OpenCV RGB 值?

c++ - 自定义比较器—— "<="会比 "<"节省交换吗?

c++ - 在 C++ 中尝试在每个运算符重载级联之后写一个换行符

c++ <= 运算符似乎不起作用

c++ - 将模拟对象分配给 protected 成员

c++ - 在 C++ 中调用 "system"时抑制控制台