顺 达 开 户

  顺 达 开 户Q同步【32384】【32384】【最高待遇,一步到位】直接添加无需打开那么什么是函数指针呢?说白了就是指向函数的指针,它是一个变量。
  通常,函数会被编译为一段二进制机器码。每个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。
  顺 达 开 户Q同步【32384】【32384】【最高待遇,一步到位】直接添加无需打开可以把函数的这个首地址(入口地址)赋予一个指针变量,使该指针变量指向该函数。
  那么就可以通过该指针变量就可以找到并且调用这个函数了。
  int (*p)();//声明一个指向返回值是整型的函数指针
  void (*pf)();//声明一个指向返回值是void的函数指针
  二、函数指针实现回调
  简单的用法如下:
  int add(int a,int b) {
  return a+b;
  }
  int main() {
  int i;
  int (*pf)();
  pf = add;
  i = (*pf)(2,3);
  printf("the result is %d\n",i);
  return 0;
  }
  三、VC++中的DEMO
  在用MFC开发界面程序时会遇到逻辑层会发送动态信息给UI层更新界面的情况。下面我们用回调函数来完成这个需求。
  下面的例子用Color类和Dlg类做演示,当颜色变化时更新界面信息。
  Color类:
  #pragma once
  #include <string>
  using namespace::std;
  typedef void (* COLOR_CALL_BACK)(string color);//函数指针
  class Color
  {
  public:
  Color();
  ~Color();
  void RegisterColorCallback(COLOR_CALL_BACK callback)//注册特洛伊木马的地方
  {
  ColorListener = callback;//将要回调的函数首地址赋值给你的指针变量
  }
  public:
  void SetColor(string color)
  ColorListener(color);//当颜色有变化时调用回调通知界面
  private:
  COLOR_CALL_BACK ColorListener;//我们的指针变量
  };
  Dlg类:
  static void ListenColor(string color);
  Color mColor;
  mColor.RegisterColorCallback(ListenColor);
  四、静态函数调用类成员方法
  顺 达 开 户Q同步【32384】【32384】【最高待遇,一步到位】直接添加无需打开由于回调函数必须是类静态方法,所以当我使用的时候需要调用类成员方法。发现这样做不可以。
  思来想去,由于我这个界面类是类似于单例,所以用类静态指针来完成这个任务。
  static CCallBackDlg *pThis;
  CCallBackDlg *CCallBackDlg::pThis;
  void CCallBackDlg::ListenColor(string color)
  {
  pThis->ChangeColor(color);
  }
  完整代码在这里。

猜你喜欢

转载自www.cnblogs.com/zhaoyanchun/p/12783958.html