c回调函数:基于C编程的回调函数



回调是基于C编程WindowsSDK技术不是针对C员可以将个C直接作为回调但是如果试图直接使用C成员作为回调将发生甚至编译就不能通过
分析原因:
普通C成员都隐含了个传递作为参数亦即“this”指针C通过传递个指向自身指针给其成员从而实现可以访问C数据成员这也可以理解为什么C多个例子可以共享成员但是确有区别数据成员由于this指针作用使得将个CALLBACK型成员作为回调安装时就会隐含this指针使得参数个数不匹配从而导致回调安装失败
解决方案:
,不使用成员直接使用普通C为了实现在C中可以访问类成员变量可以使用友元操作符(friend)在C中将该C介绍说明为类友元即可这种处理机制和普通C编程中使用回调
2,使用静态成员静态成员不使用this指针作为隐含参数这样就可以作为回调静态成员具有两大特点:其可以在没有类例子情况下使用;其 2只能访问静态成员变量和静态成员不能访问非静态成员变量和非静态成员由于在C中使用类成员作为回调就是为了访问所有成员变量和成员如果作不到这点将不具有实际意义我们通过使用静态成员对非静态成员包装办法来解决问题类例子可以通过附加参数或全局变量方式方式传递到静态成员分别举例如下:
1参数传递方式
#<iostream.h>
TClassA
{
public:
voidDisplay(constchar*text){cout<<text<<endl;};
voidWrapper_To_Call_Display(void*pt2Object,char*text);
//more....
};
//静态包装能够成员Display,本身做为回调来使用
voidTClassA::Wrapper_To_Call_Display(void*pt2Object,char*)
{
//显式类型转换
TClassA*mySelf=(TClassA*)pt2Object;
//普通成员
mySelf->Display();
}
//回调宿主,在这里回被使用
voidDoItA(void*pt2Object,void(*pt2Function)(void*pt2Object,char*text))
{
//使用回调 [Page]
pt2Function(pt2Object,\"hi,i’mcallingbackusingaargument;-)\");
}
//执行举例
voidCallback_Using_Argument
{
TClassAobjA;
DoItA((void*)&objA,TClassA::Wrapper_To_Call_Display);
}
2全局变量方式
#<iostream.h>
void*pt2Object;//全局变量,可以指向任意对象
TClassB
{
public:
voidDisplay(constchar*text){cout<<text<<endl;};
voidWrapper_To_Call_Display(char*text);
};
//静态包装
voidTClassB::Wrapper_To_Call_Display(char*)
{
//需要保证全局变量值正确性
TClassB*mySelf=(TClassB*)pt2Object;
mySelf->Display();
}
//回宿主,在这里回被使用
voidDoItB(void(*pt2Function)(char*text))
{

pt2Function(\"hi,i’mcallingbackusingaglobal;-)\");//makecallback
}
//执行举例
voidCallback_Using_Global
{
TClassBobjB;
pt2Object=(void*)&objB;
DoItB(TClassB::Wrapper_To_Call_Display);


}
注意:通过上面两种思路方法比较可以看出第2种思路方法中静态包装可以和普通成员保持签名当回调宿主接口不能改变时这种思路方法特别有用使用了全局变量也不是个好设计
Tags:  vc回调函数 什么是回调函数 回调函数 c回调函数

延伸阅读

最新评论

发表评论