c++回调实现

回调是A将一个函数指针传给B,然后调用B,B在执行自身函数后,再在合适的时候执行A的这个函数指针,这样就能避免A和B的相互包含和链接,在大型项目中回调是一种打破循环依赖的常用技术。


typedef void(CALLBACK* MyCallBack)(const char *);
typedef void(*MyFuncB)(MyCallBack, const char *);

//回调函数
void CALLBACK FuncC(const char* pszStr)
{
	std::cout << "FunC is Running" << std::endl;
	if (!pszStr)
	{
		return;
	}
	std::cout << pszStr << std::endl;
}

//设置回调,并且执行FuncB
void FuncA(MyFuncB pFunB, MyCallBack pCallBAck, const char * pszStr)
{
	std::cout << "FunA is Running" << std::endl;
	if (pCallBAck && pFunB)
	{
		pFunB(pCallBAck, pszStr);
	}
}

void FunB(MyCallBack pCallBAck, const char * pszStr)
{
	std::cout << "FunB is Running" << std::endl;
	if (pCallBAck)
	{
		pCallBAck(pszStr);
	}
}

void FuncD(void)
{
	std::cout << "FunD is Running" << std::endl;
}

class  CTestA
{
public:
	void SetCallBack(MyCallBack pCallBack,const char* pszStr)
	{
		std::cout << "SetCallBack" << std::endl;
		if (pCallBack && pszStr)
		{
			m_pCallBack = pCallBack;
			m_pszStr = (char*)pszStr;
		}
		DoCallBack();
	}

	void DoCallBack()
	{
		std::cout << "DoCallBack Running" << std::endl;
		if (m_pCallBack)
		{
			m_pCallBack(m_pszStr);
		}
	}

private:
	MyCallBack m_pCallBack;
	char* m_pszStr;
};

class CTestB
{
public:
	void static CALLBACK FuncCallBack(const char* pszStr)//非 static比较麻烦
	{
		if (pszStr)
		{
			std::cout << pszStr << std::endl;
		}
		 
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	FuncA(FunB, FuncC,"hello");
	FuncD();

	CTestA a;
	a.SetCallBack(CTestB::FuncCallBack, "hello");

	return 0;
}

boost::bind也能实现类似功能


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值