静态函数中的非静态参数

Non-static parameter inside a static function

本文关键字:静态 参数 静态函数      更新时间:2023-10-16

我在MyClass中有这个静态回调函数,我尝试从中调用另一个静态函数。但是有一个问题,Register(( 采用的参数之一是非静态类变量。

我想使用"this">

关键字来克服这个问题,但似乎我无法("this":只能在非静态成员函数中引用(。这是我的代码:

class MyClass
{
...
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam);
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK);
    KEYBLOCK *kb;       
...
}
LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN) 
    {
        MyClass::Register(p->vkCode,this->kb);
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

有什么建议吗?

鉴于您写的内容,如果没有更多信息,很难回答这个问题。

但是,假设应该处理MyClass的所有实例,我建议添加一个static std::list<MyClass *>,您将每个实例的this指针放入构造函数中以进行MyClass,然后在MyClass的析构函数中以从此列表中删除this

然后在静态 klHkProc(( 中,您将遍历所有 MyClass 实例的静态列表,并且对于每个调用MyClass::Register(),每个此类注册的 MyClass 实例的kb

以下是执行此操作的代码的粗略概述:

class MyClass
{
...
public:
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam);
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK);
    static std::list<MyClass *> allInstances;
    KEYBLOCK *kb;
    MyClass() {
      ...
      allInstances.push_back(this);
      ...
    }
    ~MyClass() {
      ...
      // Assumes not a huge list of instances as this is O(n) and thus destruction
      // of all instances of MyClass in O(n^2) on the number of instances.
      allInstances.remove(this);
      ...
    }
...
};
LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN)
    {
        std::list<MyClass *> itr = allInstances.begin();
        std::list<MyClass *> end = allInstances.end();
        for (; itr != end; ++itr) {
          MyClass *current = *itr;
          MyClass::Register(p->vkCode, current->kb);
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

静态成员和任何特定对象实例之间没有隐式连接。

您可以将指向MyClass对象的指针或引用传递给klHkProc(),然后它可以传递给Register()

一般来说,如果 KEYBLOCK *kb 不是静态的,则不能在静态函数中引用它。 "this"指针仅在对象的实例中有意义。因此,如果 KEYBLOCK *kb 仅在实例化对象中有意义,则必须在 Register 或 klHkProc 中实例化 MyClass。如果您为我们提供了更好的上下文,而不仅仅是显示调用者,那么确定后者在 Register 中实例化 MyClass 是否有意义会更容易。