CALLBACK 回调函数 一个小程序帮助理解回调函数

//个人愚见 错漏难免 不保无误

#include <windows.h>
#include <iostream>
using namespace std;

 

class CAClass
{
public:
 CAClass();
 typedef void(CALLBACK  *fnShowCallBack)();//函数指针
 static  void CALLBACK show();                       //回调函数
 void memShow(int);                                       //成员函数

 

public: 
 fnShowCallBack m_fnCallback; //函数指针 用于实现回调 
 int m_imem;

 

private:
 static CAClass* pToThis;  //静态全局指针
 void initpToThis();            //使全局指针pToThis指向this
 void callbackShow();        //回调专用函数      
};

 

//静态全局指针初始化为NULL
CAClass* CAClass::pToThis = NULL;

 

CAClass::CAClass():
     m_imem(100)

   , m_fnCallback(NULL)
{
 //使全局指针pToThis指向this
 CAClass::initpToThis();
}

 

//使全局指针pToThis指向this
void CAClass::initpToThis()
{
 pToThis = this;
}

 

//回调函数
void CAClass::show()
{
 //pToThis->memShow(456);       //用全局指针实现调用
 return pToThis->callbackShow();//返回一成员函数(回调专用)以避免使用pToThis
}

 

//回调专用
void CAClass::callbackShow()
{
 cout<<"回调函数的操作转到这个函数中 免去全局指针的使用"<<endl;
 pToThis->memShow(123); //可以用全局指针
 memShow(123);                //也可以免去全局指针
}

 

//成员函数
void CAClass::memShow(int value)
{
 cout<<"输出成员变量:"<<m_imem<<endl;
 cout<<"成员函数调用:"<<value<<endl;
}

 

 

 

//第二个类
class class2
{
public:
 class2();
 static void CALLBACK show();
 void show(int);
 int m_ii;
private:
 static class2* pToThis;
 void initpToThis();
};

 

class2* class2::pToThis = NULL;
void class2::initpToThis()
{
 pToThis = this;
}


class2::class2()
{
 class2::initpToThis();
}


void class2::show()
{   //回调函数
 cout<<"第二个类中的回调实现:"<<pToThis->m_ii<<endl;
 pToThis->show(88888);
}


void class2::show(int value)
{
 cout<<"第二个类中的成员函数:"<<value<<endl;
}


//定义一个单独的回调函数
void CALLBACK showwww()
{
 cout<<"这不是一个类的静态成员函数"<<endl;
}

 

 

int main()
{
 //第一种回调方法(比较怪异,暗藏危机。只为说明回调的用法)
 //如果没有实例化对象这种方法会失败(不实例化对象可以寻址“成员函数”却无法寻址“成员变量”)
 //具体原因可以参考《深度探索c++对象模型》一书,我不能提供比较理想的解释
 
 CAClass ob1;//没有这一句这种方法会失败,但是如果去掉成员变量m_imem就会成功
 ob1.m_imem = 111111;
 cout<<"第一种回调方法:"<<endl;
 CAClass::fnShowCallBack pFn = NULL;//定义函数指针
  pFn = CAClass::show;
  if (pFn!=NULL)
  {
   pFn();//此处实现回调
  }
 
  //第二种回调方法
   cout<<"/n"<<"第二种回调方法:"<<endl;
   CAClass ob;
   ob.memShow(123);//对象调用
   ob.m_fnCallback = CAClass::show;
   if (ob.m_fnCallback!=NULL)
   {
    ob.m_fnCallback();//此处实现回调
   }

 cout<<endl;

 //注意此处pFn()与第一次调用pFn()的结果的区别
 //具体原因可以参考《深度探索c++对象模型》一书,我不能提供比较理想的解释
 cout<<"第一种回调方法:"<<endl;
 pFn();

   cout<<endl; 

 //其他方法实现回调.............


 cout<<"第三种回调方法:"<<endl;
 class2 ob3;
 ob3.m_ii = 99999;
 ob.m_fnCallback = class2::show;//注意必须先实例化class2 的对象
 ob.m_fnCallback();

 cout<<endl; 


 cout<<"第四种回调方法:"<<endl;
 ob.m_fnCallback = showwww;
 ob.m_fnCallback();

 cout<<"/n"<<"输入任意字符 按回车结束:";
 INT i;
 cin>>i;

 cout<<endl; 
 return 1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值