回调函数做参数,实际上就是定义一个全局函数,在这个函数中完成具体的实现方法;然后在某一个应用方法中,定义一个空方法声明(全局函数的函数指针),类似于声明变量,然后写一个接口函数,将此前声明的全局函数的函数指针以及全局函数所需要的相关参数传递进来,使这个应用方法中的函数指针指向全局函数,然后通过此方法生成的对象就可以调用全局函数了。
函数做参数传递:
#include <stdio.h> #include <stdlib.h> int Test1() { for(int i = 0;i<3;i++) { printf("test1===\n"); } return 0; } int Test2(int num) { for(int i = 0;i<3;i++) { printf("test2===%d\n",num); } return 0; } void Caller1(int(*ptr)()) //指向函数的指针做参数 { (*ptr)();//相当于调用函数 } void Caller2(int(*ptr)(int num),int num) //函数指针做参数 (函数体与参数的关系) { (*ptr)(num); //传递参数调用函数 } int main() { printf("=========tese1=============\n"); Caller1(Test1); printf("=========tese2=============\n"); Caller2(Test2,30); getchar(); return 0; }
简单归纳一下类中调用回调函数思路:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int(*FP)(int num); //宏声明函数指针 int Test(int num) //回调函数 { for(int i = 0;i<3;i++) { printf("test===%d\n",num); } return 0; } class Caller{ private: FP fp; //声明函数指针 int Num; public: Caller(); ~Caller(); void GetFp(FP a,int num);//指针函数的参数要单独传递 void Print(); }; Caller::Caller() { Num = 0; } Caller::~Caller() { } void Caller::GetFp(FP a,int num) { fp = a; //指针传递 Num = num; //参数传递 } void Caller::Print() //调用函数 { fp(Num); } int main() { Caller obj; obj.GetFp(Test,5); obj.Print(); return 0; }