C++中实现回调的方法有多种,下面介绍两种常见的实现方式。
方式一:函数指针
通过函数指针实现回调,需要定义一个函数指针类型,将回调函数与函数指针进行绑定,然后在合适的时机调用函数指针即可。
示例1
定义一个函数指针类型,函数原型为:
typedef void (*MyCallbackFunc) (int arg1, int arg2);
其中,第一个参数表示回调函数的返回值类型,第二个参数表示回调函数的参数个数及类型。
定义一个类,成员变量为函数指针类型,成员函数用于设置和触发回调函数。
class MyClass {
public:
void SetCallback(MyCallbackFunc callback) {
_callback = callback;
}
void DoSomething() {
// 判断回调函数是否为空指针
if (_callback != nullptr) {
// 调用回调函数
_callback(10, 20);
}
}
private:
MyCallbackFunc _callback; // 函数指针类型成员变量
};
客户端需要实现一个回调函数,并将其与类的函数指针绑定。示例代码如下:
void MyCallback(int arg1, int arg2) {
// do something
}
int main() {
MyClass myClass;
myClass.SetCallback(MyCallback);
myClass.DoSomething();
return 0;
}
在main函数中生成一个MyClass对象,调用SetCallback函数将MyCallback函数与函数指针绑定,然后调用DoSomething函数触发回调函数。
示例2
使用STL中的函数对象(function object)代替函数指针实现回调。function object 是一个可调用的对象,可以表示函数指针、lambda表达式、成员函数指针等。
定义一个函数对象类型,函数原型与上一个示例中的函数指针类型相同。
using MyCallbackFunc = std::function<void(int, int)>;
使用STL中的std::function模板类代替函数指针类型。
重写MyClass类,将函数指针类型的成员变量改为函数对象类型。
class MyClass {
public:
void SetCallback(MyCallbackFunc callback) {
_callback = callback;
}
void DoSomething() {
// 判断回调函数是否为空
if (_callback) {
_callback(10, 20);
}
}
private:
MyCallbackFunc _callback;
};
客户端代码与示例1中的相同。
方式二:虚函数
使用虚函数也可以实现回调。
示例1
定义一个基类,将回调函数声明为虚函数。
class MyBaseClass {
public:
virtual void MyCallback(int arg1, int arg2) { }
};
派生一个子类MyClass,在其内部实现回调函数。
class MyClass : public MyBaseClass {
public:
void DoSomething() {
// ...
// 判断回调函数是否为空
if (_callback) {
_callback(10, 20);
}
// ...
}
private:
void MyCallback(int arg1, int arg2) override {
// do something
}
};
在MyClass类中调用MyCallback函数即可触发回调。
示例2
使用虚函数时,可以使用接口(interface)定义回调函数,客户端需要实现接口中的回调函数。
定义一个接口,包含所有需要实现的回调函数。
class IMyCallback {
public:
virtual ~IMyCallback() { }
virtual void MyCallback(int arg1, int arg2) { } // 回调函数声明
};
重新定义MyClass类,将回调函数类型改为IMyCallback接口。
class MyClass {
public:
void SetCallback(IMyCallback* callback) {
_callback = callback;
}
void DoSomething() {
// ...
if (_callback) {
_callback->MyCallback(10, 20);
}
// ...
}
private:
IMyCallback* _callback;
};
客户端需要实现MyCallback函数,代码如下:
class MyCallbackImpl : public IMyCallback {
public:
void MyCallback(int arg1, int arg2) override {
// do something
}
};
int main() {
MyClass myClass;
MyCallbackImpl callbackImpl;
myClass.SetCallback(&callbackImpl);
myClass.DoSomething();
return 0;
}
在main函数中生成一个MyClass对象,同时生成一个MyCallbackImpl对象实现接口中的回调函数,然后调用SetCallback函数将MyCallbackImpl对象的指针作为参数传入,最后调用DoSomething函数触发回调函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中如何实现回调的方法示例 - Python技术站