简单说明
C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。
把成员函数作为回调函数,可以把该成员函数声明为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。
因为类的成员函数需要隐含的this指针 而回调函数没有办法提供
代码示例一
//头文件
//声明一个函数指针类型,
typedef bool(*CallbackFunc )(void*pThis,double num);
Class A
{
void FuncA()
{
m_callBackFunc(m_Ptr,num_A);
}
void SetCallBack(CallbackFunc callback,void *pthis)
{
m_callBackFunc = callback;
m_Ptr = pthis;
}
CallbackFunc m_callBackFunc;
void* m_Ptr;
int num_A;
}
Class B
{
//注意参数要匹配前面声明的函数指针类型,且声明为静态
static bool FuncB(void *pVoid,double tmpNum)
{
print<<pVoid->m_num;
m_num = tmpNum;
print<<pVoid->m_num;
}
public:
int m_num;
}
//调用
main()
{
A a;
B b;
b.m_num = 2.0;
a.SetCallBack(FuncB,&b);
a.FuncA();//实现了类A调用了b的函数,并把a的成员值传给了b改变了b成员的值
}
这种情况也适用于B包含A的情况,即B里面有A的对象或对象指针,就可以实现b调用a进行一系列操作然后把a的值传回来给b;如下所示
代码示例二
//头文件
typedef bool(*CallbackFunc )(void*pThis,int num);//声明一个函数指针
Class A
{
void FuncA()
{
m_callBackFunc(m_Ptr,num_A);
}
void SetCallBack(CallbackFunc callback,void *pthis)
{
m_callBackFunc = callback;
m_Ptr = pthis;
}
CallbackFunc m_callBackFunc;
void* m_Ptr;
int num_A;
}
Class B
{
static bool FuncB(void *pVoid,int tmpNum)
{
print<<pVoid->m_num;
m_num = tmpNum;
print<<pVoid->m_num;
}
void Run()
{
m_a.SetCallBack(FuncB,this);
m_a.FuncA();
}
public:
A m_a;
int m_num;
}
//调用
main()
{
B b;
b.m_num = 2;
b.Run();
}