zoukankan      html  css  js  c++  java
  • this与回调函数

    在c++里回调函数分2种:

    全局函数:不包函在类的内部 或 类内部的静态函数

    类内部函数(或叫 局部函数):需要通过实例化后的对象调用的

    因c++是c的一层封装,所以类似c里struct内的函数

    在传递回调函数时只要保证 函数结构一致就可通过编译检查:

    typedef int TestFun1(int a,int b);
    typedef int (*TestFun2)(int a,int b);//也可这样写 说明需要的是一个地址。 一定要加括号。 因*会与前边混到一起。
    
    void exe(TestFun1 tfun)(
        tfun(1,2);
    }
    
    int tf1(int a,int b){
        return a+b;
    }
    
    //exe(tf1)

    全局函数这样用就可以,但局部函数是不能这样用的,因局部函数是这样的

    class Test1{
    public:
        void fun0(int a);
    }
    void Test1::fun0(int a){
    }
    
    //在调用时 
    
    void main(){
          Test1 *t = new Test1();
           t->fun0(11);//重点在这 这看起来是fun0(),其实是 fun0(t,11);
    }
    //只有fun0(t,11) 才能使fun0内使用this。 this就是t了.

    局部函数是需要 this 的。

    如果像全局函数那样传,在执行回调函数时全局函数不需要this ,而局部函数需要。

    所以局部函数的回调要这样

    class A{
    public:
        int fun0(int a,int b);
    }
    typedef int A::TestFun1(int a,int b);
    typedef int (A::*TestFun2)(int a,int b);//也可这样写 说明需要的是一个地址。 一定要加括号。 因*会与前边混到一起。
    
    void exe(TestFun1 tfun,A *p)(
        (p->*tfun)(1,2);//要加括号 不然机器会这样 p-> *(tfun(1,2))
    }
    
    void main(){
          A *a = new A();
          exe(A::fun0,a);   
    }
  • 相关阅读:
    简单地通过Python库使用python的socket编程
    js 实现继承的几种方式
    JAVA中获取当前系统时间
    IntelliJ Idea 常用快捷键列表
    关于报错:There is already 'xxxController' bean method的解决方法
    mysql 使用 GROUP BY 时报错 ERROR 1055 (42000)
    安装系统,用cmd进行分区
    Bootstrap关闭当前页
    bootstrap的日期选择器
    Bootstrap如何关闭弹窗
  • 原文地址:https://www.cnblogs.com/mattins/p/3387853.html
Copyright © 2011-2022 走看看