在C++中,回调函数是一种常见的实现类之间通信的方法。回调函数可以让一个类在其内部方法中调用另一个类提供的函数,从而实现在不同类之间传递消息、触发事件或共享处理逻辑。以下是一个简单示例,说明如何使用函数指针实现类之间的回调:
#include <iostream>
// 定义一个回调函数的原型
typedef void (*CallbackFunction)(int data);
// 假设我们有一个类A,它需要在某个事件发生时通知其他类
class ClassA {
public:
void setCallback(CallbackFunction callback) {
this->callback = callback;
}
void triggerEvent(int someData) {
if (callback != nullptr) {
callback(someData); // 当事件触发时,调用回调函数
}
}
private:
CallbackFunction callback = nullptr;
};
// 另一个类B,想要在ClassA的事件发生时得到通知
class ClassB {
public:
void onEvent(int data) {
std::cout << "ClassB received event with data: " << data << std::endl;
}
};
int main() {
ClassA objA;
ClassB objB;
// 将ClassB的成员函数作为回调函数赋值给ClassA
objA.setCallback(&ClassB::onEvent);
// 当事件触发时,实际上是调用了ClassB的onEvent方法
objA.triggerEvent(123);
return 0;
}
// 注意:上述例子中ClassB::onEvent需要修改为静态成员函数才能直接作为函数指针使用
// 若要绑定到非静态成员函数,可以考虑使用std::function结合std::bind或者lambda表达式
为了能将类B的非静态成员函数作为回调,可以使用std::function
和std::bind
来包装成员函数:
#include <iostream>
#include <functional>
class ClassA {
public:
typedef std::function<void(int)> CallbackFunction;
void setCallback(const CallbackFunction& callback) {
this->callback = callback;
}
void triggerEvent(int someData) {
if (callback) {
callback(someData);
}
}
private:
CallbackFunction callback;
};
class ClassB {
public:
void onEvent(int data) {
std::cout << "ClassB received event with data: " << data << std::endl;
}
};
int main() {
ClassA objA;
ClassB objB;
// 使用std::bind绑定类B的对象与其成员函数
auto boundFunction = std::bind(&ClassB::onEvent, &objB, std::placeholders::_1);
objA.setCallback(boundFunction);
objA.triggerEvent(456);
return 0;
}
// 或者更简洁地使用lambda表达式:
// objA.setCallback([&objB](int data){ objB.onEvent(data); });
在这个例子中,ClassA
接收一个std::function
类型的回调函数,并在触发事件时调用它。ClassB
通过使用std::bind
将其成员函数onEvent
绑定到特定对象后传递给ClassA
,实现了类间的通信。使用lambda表达式可以达到同样的目的,而且更为简洁。