回调函数,百度百科给的解释是:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
废话不多说,先上代码。
/利用回调函数实现自定义定时器
#include <iostream>
#include <time.h>
using namespace std;
void MyTimer(unsigned timeGap);
void MySetTimer(void (*functor)(unsigned timeGap), unsigned timeGap);
int main(){
int timeGap;
cout<<"请输入时间间隔"<<endl;
cin>>timeGap;
MySetTimer(MyTimer, timeGap);
return 0;
}
void MyTimer(unsigned timeGap){
static int i=0;
clock_t now;
clock_t _time = clock();
while (true){
now = clock();
if ((now-_time)%(timeGap*CLOCKS_PER_SEC)==0){
cout<<"第"<<++i<<"次触发"<<endl;
cout<<"Hello World!"<<endl;
_time = now;
}
}
}
void MySetTimer(void (*functor)(unsigned), unsigned timeGap){
functor(timeGap);
}
运行结果如下:
程序每隔1秒被触发一次,输出“Hello World!”,比较简单,唯一值得强调的是下面这部分代码中的functor,它是一个函数指针,能够接受所有返回类型为void含有一个unsigned参数的函数的地址。
void MySetTimer(void (*functor)(unsigned), unsigned timeGap)
{
MyTimer(timeGap);
}
例如可以另外定义一个函数MyTest如下:
void MyTest(unsigned n)
{
///
}
在主函数中即可用MySetTimer(MyTest, timeGap)来调用MyTest函数。这样便可以实现调用函数和被调用函数的分离。调用者不关心谁是被调用者,也不关心被调用者内部是怎么实现的,所有它需知道的只是存在某种特定类型的函数而已。这样也相当于实现了对被调用者的封装,可以通过一个函数原型实现一系列不同的函数操作。