静态函数内的非静态参数

时间:2012-04-05 16:08:09

标签: c++ class variables static non-static

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

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

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

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

然后在你的静态klHkProc()中,你将迭代MyClass的所有实例的静态列表,并为每一个调用MyClass::Register()迭代kb每个这样的注册实例{ {1}}。

以下是执行此操作的代码的大致轮廓:

MyClass

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

一般来说,如果KEYBLOCK * kb不是静态的,则无法在静态函数中引用它。 'this'指针只在对象的实例中有意义。因此,如果KEYBLOCK * kb仅在实例化对象中有意义,则必须在Register或klHkProc中实例化MyClass。如果你给了我们一个更好的寄存器应该做什么的上下文而不仅仅是显示调用者,那么更容易确定后者是否有意义在Register中实例化MyClass。