说起回调函数,大家可能觉得会很高大上,或者是非常困难。但是今天呢,我想和大家一起分享一个简单的回调函数通过使用C++的类来实现。使用的环境是VS2017+win10。好,废话不多说直接分析。
回调函数,本质上是将函数的指针作为参数,然后在函数内部通过函数指针来调用该函数。请记住第一点,函数名是地址。你可以直接用 函数名(参数) 的方式来调用函数,或是像(*函数名)(参数)来调用。
上部分代码:
CallBackFunc.h
#pragma once
typedef struct Param;
typedef bool (*pFunc)(Param* param);
class CallBackFunc
{
public:
CallBackFunc(pFunc myFunc, Param* param) :m_myFunc(myFunc), m_param(param) {}
void CallFunc();
~CallBackFunc();
private:
pFunc m_myFunc;
Param* m_param;
};
这是类的头文件。需要值得注意的是,pFunc和Param都是声明,但是没有定义,如果不这么做编译器会报错,提示无法识别该类型。你可能会说那难道不定义了吗?不是的,一般是在我们要使用的地方定义。
CallBackFunc.cpp
#include "CallBackFunc.h"
CallBackFunc::~CallBackFunc()
{
m_myFunc = 0;
m_param = 0;
}
void CallBackFunc::CallFunc()
{
if (m_myFunc != 0 && m_param != 0)
m_myFunc(m_param);
}
到此,有关类的部分已经写完了。
你可能会问这样直运行的话pFunc和Param都未定义那要怎么做呢?
别着急接下来就是怎么定义他们了。
main.cpp
#include"CallBackFunc.h"
#include<iostream>
typedef struct Param
{
int age;
char sex;
char name[64];
Param(int a, char s) :age(a), sex(s) {}
};
bool printFunc(Param *param)
{
if (param == NULL)
return false;
std::cout << "age: " << param->age << std::endl;
std::cout << "sex: " << param->sex << std::endl;
std::cout << "name: " << param->name << std::endl;
return true;
}
int main()
{
Param* myparam = new Param(15,'f');
strcpy_s(myparam->name, 64, "John-Timer");
CallBackFunc test(printFunc,myparam);
test.CallFunc();
test.~CallBackFunc();
delete myparam;
myparam = 0;
}
注意这里你定义的printFunc函数的返回值与参数列表一定要与之前定义的函数指针类型值相同,否则会报错。这里的Param你可以想怎么定义就怎么定义,但在这个文件中你只能定义一次。至于函数,只要函数名不同即可,返回值和参数列表不可以改。
最后是运行结果:
如果大家觉得有帮助麻烦点个赞,谢谢大家了。