函数指针 和 回调函数

/*
开通csdn以来 都没写过文章(只是偷偷的看)  这算是第一篇文章 今天coding 写到了 随手记下
需求:大概就是写个执行器 然后执行器有一些回调函数 外部具体来实现回调函数
有问题请发邮件: 457952887@qq.com
转载请写出处:http://blog.csdn.net/d457952887
*/
#include <windows.h>
#include <map>

// 声明一个接口类
// 这个接口类 对管理器提供接口
class CallFunClass
{
public:
	CallFunClass(){}
	virtual ~CallFunClass(){}
	virtual void callFunction(){}
};

// 声明 函数指针
// 也就是把函数搞成一个变量
typedef void (CallFunClass::*callFun)();
#define CALLFUNC(_func) (callFun)(&_func)


enum eExecState
{
	ES_NONE			=	0	,
	ES_RUN_PRO				,
	ES_RUNING				,
	ES_RUN_POST				,
	ES_MAX
};

typedef std::map<int, callFun> CallFunTable;

class Executor
{
public:

	Executor(CallFunClass *callClass):
	m_pCallClass(callClass),
	m_eExecState(ES_NONE)
	{

	}

	virtual ~Executor(){}

	void setState(eExecState state){ m_eExecState = state; }
	eExecState getState(){ return m_eExecState; }

	// 注册回调函数
	void registerCallFunc(callFun callF, int funID){ m_CallFunTable[funID] = callF; }

	void run()
	{
		// 回调到id的函数		switch(m_eExecState)
		{
		case ES_NONE:{ callBackFun(ES_NONE); /*do something*/ } break;
		case ES_RUN_PRO:{ callBackFun(ES_RUN_PRO); /*do something*/ } break;
		case ES_RUNING:{ callBackFun(ES_RUNING); /*do something*/ } break;
		case ES_RUN_POST:{ callBackFun(ES_RUN_POST); /*do something*/ } break;
		}
	}



protected:

	// 回调到id的函数
	bool callBackFun(int funID)
	{
		bool bCall = false;
		CallFunTable::iterator iter = m_CallFunTable.find(funID);
		if (iter != m_CallFunTable.end())
		{
			callFun callF = iter->second;
			// 解地址 函数调用 
			(m_pCallClass->*callF)();
			bCall = true;
		}
		return bCall;
	}

private:

	eExecState	m_eExecState;
	CallFunTable	m_CallFunTable;
	CallFunClass	*m_pCallClass;
};


// 回调函数类
class MyClass : public CallFunClass
{
public:
	MyClass(){}
	~MyClass(){}

	void func0(){ printf("func0\n"); /*do something*/ }
	void func1(){ printf("func1\n");/*do something*/ }
	void func2(){ printf("func2\n");/*do something*/ }
	void func3(){ printf("func3\n");/*do something*/ }
};


// ok 测试一下
int main()
{
	MyClass myClass;
	Executor exec(&myClass);
	exec.registerCallFunc(CALLFUNC(MyClass::func0), ES_NONE);
	exec.registerCallFunc(CALLFUNC(MyClass::func1), ES_RUN_PRO);
	exec.registerCallFunc(CALLFUNC(MyClass::func2), ES_RUNING);
	exec.registerCallFunc(CALLFUNC(MyClass::func3), ES_RUN_POST);

	while (true)
	{
		exec.run();
		int state = (int)exec.getState();
		exec.setState(((eExecState)state >= ES_MAX) ? ES_NONE : (eExecState)++state);
		Sleep(1000);
	}

	return 0;
}
//例子在vs2008下测试通过
/*
另外:主要我这这儿遇到个问题 如果建立个mfc dialog框 使用dialog类继承CallFunClass 在声明实现回调函数 那么函数调用就会有问题
对mfc 这个不怎么熟悉 觉得这个太难用了  求解??? 如果晓得 请告之我 谢谢
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值