函数指针

用法一:调用函数  

       函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数

typedef int (*SERVER_PACKET_HANDLER)(CSession* session,char* packet);   //定义一个返回int类型的函数指针,参数为(CSession* session,char* packet)

SERVER_PACKET_HANDLER handler;                                                                //声明变量handler

char buf[4]={0};
 memcpy(buf,packet->RecvBuf,4);
 int type = *(int*)buf;

handler = CServerPacketDispatcher::GetSingleton()->GetHandler(type);             //赋值,将参数为(CSession* session,char* packet)的函数的首地址赋给变量handler

if(handler != NULL)
 {
         handler(session,packet);                                                                               //调用函数
 }

用法二:调用动态链接库

void CBCorpuscleSystemApp::UserLogin()
{
 typedef int (*lpFun)(char *pUserName/*用与输出*/,              CFont *pfont=NULL,int fontHeight=10);
 
 HINSTANCE hDll;   //DLL句柄 
 hDll = LoadLibrary("UserLogin.dll");
 

 lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"UserLoginShow");                                    
 

 char UserName[64];


 user_level =pShowDlg(UserName,&framefont,11*(GetSystemMetrics( SM_CXSCREEN )/1024.0) );


 m_strInspecDoctor=UserName;

 FreeLibrary(hDll);
}

 

用法三:将函数指针传递给模板类

假设有一模板类:

template<class T>
class HandlerHash
{
   public:
         HandlerHash() {}
         ~HandlerHash() {}
  public:
          int Insert(int id,T handler);
          T GetHandler(int id);
  private:
           map<int,T>m_handler_hash;
};

定义一个子类:

class CServerPacketDispatcher:public HandlerHash<SERVER_PACKET_HANDLER>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值