c++ 跨类调用回调函数
时间: 2023-09-29 14:07:36 浏览: 166
在C++中,可以使用函数指针或者std::function来实现跨类调用回调函数。具体实现方式如下:
1. 函数指针
定义一个函数指针类型,该函数指针类型指向回调函数的类型,例如:
```
typedef void (*CallbackFunc)(int);
```
这里定义了一个名为CallbackFunc的函数指针类型,该函数指针类型指向一个参数类型为int,返回类型为void的回调函数。
在回调函数所在的类中定义一个成员函数,该成员函数接受一个函数指针作为参数,并在需要调用回调函数时使用该函数指针,例如:
```
class CallbackClass {
public:
void setCallback(CallbackFunc func) {
m_callbackFunc = func;
}
void doSomething() {
if (m_callbackFunc) {
m_callbackFunc(123);
}
}
private:
CallbackFunc m_callbackFunc;
};
```
在其他类中定义一个成员函数,该成员函数作为回调函数,并将其地址传递给CallbackClass的setCallback函数,例如:
```
class OtherClass {
public:
void callbackFunc(int value) {
// do something with value
}
void doSomethingWithCallback() {
CallbackClass callbackObj;
callbackObj.setCallback(callbackFunc);
callbackObj.doSomething();
}
};
```
在上面的代码中,OtherClass中的callbackFunc函数就是回调函数,该函数将被CallbackClass调用。
2. std::function
std::function是C++11标准中引入的函数对象,可以用来包装任何可调用对象,包括函数指针、成员函数指针、Lambda表达式等。使用std::function可以更加灵活地实现跨类调用回调函数。
定义一个std::function类型的变量,该变量的类型与回调函数的类型一致,例如:
```
std::function<void(int)> callbackFunc;
```
在回调函数所在的类中定义一个成员函数,该成员函数接受一个std::function类型的参数,并在需要调用回调函数时使用该参数,例如:
```
class CallbackClass {
public:
void setCallback(std::function<void(int)> func) {
m_callbackFunc = func;
}
void doSomething() {
if (m_callbackFunc) {
m_callbackFunc(123);
}
}
private:
std::function<void(int)> m_callbackFunc;
};
```
在其他类中定义一个成员函数,该成员函数作为回调函数,并将其包装成std::function类型的变量,然后将该变量传递给CallbackClass的setCallback函数,例如:
```
class OtherClass {
public:
void callbackFunc(int value) {
// do something with value
}
void doSomethingWithCallback() {
CallbackClass callbackObj;
callbackObj.setCallback(std::bind(&OtherClass::callbackFunc, this, std::placeholders::_1));
callbackObj.doSomething();
}
};
```
在上面的代码中,std::bind函数将OtherClass的callbackFunc函数绑定到当前对象上,并将其包装成std::function类型的变量,然后将该变量传递给CallbackClass的setCallback函数。在回调函数中,std::placeholders::_1表示回调函数的第一个参数。
阅读全文