C++ 如何将类成员注册为回调函数?编译报错说非法指针转换
时间: 2024-03-08 20:48:02 浏览: 116
在 C++ 中,如果要将类成员函数作为回调函数传递给其他函数,需要使用静态成员函数或者全局函数来作为中间层,将回调函数传递给类成员函数。这是因为类成员函数在编译时会隐式地添加一个 `this` 指针作为第一个参数,而回调函数通常不需要这个指针。
以下是一个示例代码,其中 `register_callback` 函数需要传递一个回调函数 `cb`,并将其保存到类成员变量 `m_cb` 中:
```c++
#include <functional>
class MyClass {
public:
void register_callback(std::function<void()> cb) {
m_cb = cb;
}
static void static_callback(void* obj) {
MyClass* self = static_cast<MyClass*>(obj);
self->member_callback();
}
private:
void member_callback() {
// do something
}
std::function<void()> m_cb;
};
int main() {
MyClass obj;
// register callback using static member function
obj.register_callback(std::bind(&MyClass::static_callback, &obj, std::placeholders::_1));
return 0;
}
```
在上面的示例代码中,`static_callback` 是一个静态成员函数,接收一个 `void*` 类型的参数,将其转换为 `MyClass` 的指针,并调用 `member_callback` 成员函数。在 `main` 函数中,使用 `std::bind` 将 `static_callback` 和 `MyClass` 对象的地址绑定起来,然后传递给 `register_callback` 函数。
如果编译时出现非法指针转换的错误,可能是因为类型转换不正确或者回调函数的参数不匹配。可以检查一下回调函数的参数类型和数量,以及类型转换是否正确。
阅读全文