打印本文 打印本文  关闭窗口 关闭窗口  
C++中回调函数使用的变身大法
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:39:07  文章录入:杜斌  责任编辑:杜斌

  界面处理类 CShowGUI,数据上传类 CUploadData

  class CUploadData
  {
  ......
  typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
  int UploadFile(LPCTSTR lpFileNamePath,LPVOID lparam,SetUploadCaller Caller );
  // 接受外界出入的参数,主要是回调函数的地址通过参数Caller,
  int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;
  ...... // 注意此时不在需要GetCurState 函数了 。
  }

  class CShowGUI: public CDialog
  {
  .......
  typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
  void SetCallBack(LPCTSTR strPath);
  static int GetCurState(int nCurData, int nInAll, void * pParam) ;
  CUploadData m_Uploa
  d ; // 数据上传类是界面显示类的一个成员变量。
  .......
  }

  void CShowGUI :: SetCallBack(LPCTSTR strPath)
  {
  CUploadData myUploadData ;
  SetUploadCaller myCaller; // 声明一个函数指针变量
  myCaller = CurState ; // 取得界面处理函数的地址
  myUploadData .UploadFile(strPath,this,myCaller); // 界面处理类的函数传入,实现了数据传入与界面处理的分离 .
  }

  通过上面的演示做到了界面与数据的分离,回调函数分别扮演了不同角色,所以随着处理问题的不同应灵活应用,但同样因为处理数据类不知道界面处理类或外部调用类的类型,而更无法灵活地处理界面的不同显示方式。这方面还希望喜欢钻研技术的朋友继续研究。

  界面处理类 CShowGUI,数据上传类 CUploadData

  class CUploadData
  {
  ......
  typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
  int UploadFile(LPCTSTR lpFileNamePath,LPVOID lparam,SetUploadCaller Caller );
  // 接受外界出入的参数,主要是回调函数的地址通过参数Caller,
  int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;
  ...... // 注意此时不在需要GetCurState 函数了 。
  }

  class CShowGUI: public CDialog
  {
  .......
  typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
  void SetCallBack(LPCTSTR strPath);
  static int GetCurState(int nCurData, int nInAll, void * pParam) ;
  CUploadData m_Uploa
  d ; // 数据上传类是界面显示类的一个成员变量。
  .......
  }

  void CShowGUI :: SetCallBack(LPCTSTR strPath)
  {
  CUploadData myUploadData ;
  SetUploadCaller myCaller; // 声明一个函数指针变量
  myCaller = CurState ; // 取得界面处理函数的地址
  myUploadData .UploadFile(strPath,this,myCaller); // 界面处理类的函数传入,实现了数据传入与界面处理的分离 .
  }

  通过上面的演示做到了界面与数据的分离,回调函数分别扮演了不同角色,所以随着处理问题的不同应灵活应用,但同样因为处理数据类不知道界面处理类或外部调用类的类型,而更无法灵活地处理界面的不同显示方式。这方面还希望喜欢钻研技术的朋友继续研究。

打印本文 打印本文  关闭窗口 关闭窗口