zoukankan      html  css  js  c++  java
  • 如何使类的成员函数作为回调函数

    如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。  

    1). 不使用成员函数,为了访问类的成员变量,可以使用友元操作符(friend),在C++中将该函数说明为类的友元即可。   

    2). 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果做不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。 这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。(关于静态方法访问非静态变量和函数的方式请见http://www.cnblogs.com/this-543273659/archive/2011/08/29/2157966.html

    首先明白什么是回调函数:比如说被调函数void callbackf(int n){}要想作为回调函数的话,callbackf必须作为主调函数的形参出现,如void f(void (*p(int)),int n)形式才行!

    例子:

    例1:

    #include<iostream>
    using namespace std;
    class A
    {
    public:
     
     friend void callback()  //友元函数作为回调函数 friend方式实现
     {
      cout<<"回调函数开始执行了!"<<endl;
     }
    };
    void f(void (*p)())
     {
      p();

     }
    int main()
    {
     void (*p)();
     p=callback;
     f(p);
     return 0;
    }

    例2:

    #include<iostream>
    using namespace std;
    class A
    {
    public:
     
     static void callback()  //类的成员函数作为回调函数 static方式实现
     {
      cout<<"回调函数开始执行了!"<<endl;
     }
    };
    void f(void (*p)())
     {
      p();

     }
    int main()
    {
     void (*p)();
     p=A::callback;
     f(p);
     return 0;
    }

    还可以把f()函数设为类的成员函数:

    #include<iostream>
    using namespace std;
    class A
    {
    public:
     
     static void callback()  //类的成员函数作为回调函数 static方式实现
     {
      cout<<"回调函数开始执行了!"<<endl;
     }
     void f(void (*p)())
     {
      p();

     }
    };

    int main()
    {
     A a;
     void (*p)();
     p=A::callback;
     a.f(p);
     return 0; --------------------- 本文来自 rongwenbin 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/rongwenbin/article/details/20642691?utm_source=copy 

  • 相关阅读:
    操作系统丶并发并行和线程
    网络基础补充,断点续传,以及如何添加进度条
    python小游戏之贪吃蛇
    python2和3的区别丶网络编程以及socketserver多线程
    面向对象之套接字(socket)和黏包
    面向对象多继承和网络编程
    约束,自定义异常,加密,日志
    方法和函数,isinstance/issubclass/type以及反射
    面向对象之组合的补充,主动调用其他类的成员,特殊成员
    关于卡尔曼滤波和粒子滤波最直白的解释
  • 原文地址:https://www.cnblogs.com/findumars/p/9721725.html
Copyright © 2011-2022 走看看