前两天的一个任务中用到回调函数,我是在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的静态成员。