回调函数的一些总结

    技术2022-05-20  44

      前两天的一个任务中用到回调函数,我是在MFC上做的。遇到的问题是我想把回调函数作为CDialog类的成员函数,因为在回调函数中我必须用到CDialog类的变量,但是这样会出现问题,连编译都通不过。

      后来查了资料,原来回调函数是基于C编程的Windows SDK的技术,不是针对C++的。可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误。在C++中的成员函数都隐含了一个参数即this指针。

      解决方案:

      1、直接用普通的C函数作为回调函数,若在C中要访问类成员,将该C函数作为类的有元函数即可。我使用的方法是:在C函数中不访问类成员,将要传递给类成员的值赋给全局变量,在Post消息给类,让该类执行相应的操作(将全局变量的值赋值给成员变量等)。

      2、使用静态成员函数作为回调函数,静态成员函数不使用this指针作为隐含参数。但是静态成员函数对于类成员的访问也是受限制的,这一点我们要注意。

     

    对于静态成员函数,想起了之前遇到的一个问题:

    简单的写写,明白意思就行:

    class B;

     class  A:

    {

         B *b;

     

        public:

        Add(){};

     

        b->Sub();            //在这里调用的时候就会出现问题

    }

     

    class B:

    {

        A   a;

     

        public:

        Sub(){};

     

        a.Add();

       

    }

     

      现在明白是为什么了,应该将Sub()作为A类的静态成员函数。静态成员是类创建的时候就有的,而其他成员都是要在创建对象的时候才创建的。在怎个过程中并没有创建B对象,因此我们也就只能使用类B的静态成员。


    最新回复(0)