静态函数中的非静态参数
Non-static parameter inside a static function
我在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 是否有意义会更容易。
相关文章:
- 将参数中的函数\类传递给静态库
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 用作默认参数的静态成员会导致无法解析的外部
- 静态私有函数,模板化类型作为C++中的默认参数
- 具有不同参数列表的模板对象的模板静态映射
- 具有静态大小数组作为参数的泛型 lambda
- VS 2008 和 VS 2017 中静态参数的不同行为
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 来自函数参数的 C++ 静态数组声明
- 没有参数的递归,也没有静态或全局变量
- 根据模板参数可以选择静态的类成员
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- 使用非静态值作为函数中的默认参数
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- 将非静态数据成员作为默认参数传递给方法
- 如何使用静态变量来记住上次传递的参数
- 将静态参数克隆到 std::fill 导致链接器失败
- 返回类型取决于静态参数包字段
- 静态函数中的非静态参数