这里的回调机制指的是:声名一个函数,在一个类中实现,然后将地址保存在另外一个类中,这个类得到这个地址,然后调用该函数。
具体实现方法:
一、 首先在common.h中声名一个函数
#ifndef _Common_H_
#define _Common_H_
typedef int (_cdecl *CallBack )( int nAddOne, int nSecond );
#endif
二、 在A类中实现这个函数
#ifndef _A_H_
#define _A_H_
#include "common.h"
#include "b.h"
class A
{
public:
A(){};
~A(){};
public:
static int Add( int one, int second ) //一定要声名成全局的
{
return one + second;
}
};
#endif
三、 在B类中保存地址
#ifndef _B_H_
#define _B_H_
class B
{
public:
B(){};
~B(){};
public:
void setFuncAddr( void* lpvFunc )
{
m_lpvFunc = lpvFunc;
}
void* getFuncAddr()
{
return m_lpvFunc;
}
private:
void* m_lpvFunc; // 保存成void*
};
#endif
四、 使用方式
#include <iostream>
#include "b.h"
#include "a.h"
using namespace std;
int main()
{
B objB;
objB.setFuncAddr( ( void* )A::Add );
CallBack call;
call = ( CallBack )objB.getFuncAddr();
int nResult;
nResult = call( 1, 2 );
cout<< nResult << endl;
return 0;
}
如果在A中的实现,不声名成static的,在编译的时候会出现error C2440: 'type cast' : 'int (__thiscall A::*)(int,int)'无法转换成 'void *'的错误。