函数指针的一个经典应用——回调机制

<script src="win.js" type="text/javascript"></script>

这里的回调机制指的是:声名一个函数,在一个类中实现,然后将地址保存在另外一个类中,这个类得到这个地址,然后调用该函数。

具体实现方法:

一、  首先在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 *'的错误。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值