C++ 在第三方库中有注册回调函数,其参数是函数指针,我如何在自己的类中定义这个函数指针,并在这个指针函数中使用类中函数,请举例说明
时间: 2024-03-16 16:41:26 浏览: 17
假设有一个第三方库,其中定义了一个函数 `register_callback`,它的参数是一个函数指针,指向一个回调函数,原型如下:
```c++
typedef void (*CallbackFunc)(int arg1, int arg2);
void register_callback(CallbackFunc callback);
```
现在我们要在自己的类中定义这个回调函数,并在其中使用类中的成员函数。可以使用静态成员函数来实现这一目标。
例如,我们定义一个名为 `MyClass` 的类,它有一个成员函数 `my_callback`:
```c++
class MyClass {
public:
void my_callback(int arg1, int arg2) {
// 在这里实现回调函数的逻辑
}
};
```
我们可以再定义一个静态成员函数 `static_callback`,它将调用成员函数 `my_callback`:
```c++
class MyClass {
public:
void my_callback(int arg1, int arg2) {
// 在这里实现回调函数的逻辑
}
static void static_callback(int arg1, int arg2) {
MyClass* obj = reinterpret_cast<MyClass*>(arg1);
obj->my_callback(arg1, arg2);
}
};
```
然后我们可以在 `MyClass` 的构造函数中注册这个回调函数:
```c++
class MyClass {
public:
MyClass() {
register_callback(&MyClass::static_callback);
}
void my_callback(int arg1, int arg2) {
// 在这里实现回调函数的逻辑
}
static void static_callback(int arg1, int arg2) {
MyClass* obj = reinterpret_cast<MyClass*>(arg1);
obj->my_callback(arg1, arg2);
}
};
```
这样,当第三方库调用回调函数时,会先调用 `static_callback` 函数,然后再调用 `my_callback` 函数,从而实现在类中使用回调函数的目的。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)