发布网友 发布时间:2023-08-01 18:37
共1个回答
热心网友 时间:2023-08-05 15:56
1. -Style回调函数?在C语言中,通过注册函数指针的方式,来实现函数回调。如下是一个的例子。 //回调函数指针 typedef int (*functionPointer_t)(int*); int myFunc1(int *arg) { *arg = 100; return 0; } void CallerFunc(functionPointer_t fp) { int arg = 0; fp(&arg); //这里通过函数指针调用被调函数 } int main() { CallerFunc(myMemberFunc1); return 0; } 但是如果将类的成员函数作为回调的函数指针传进去。结果是不成功的。如下所示: //回调函数指针 typedef int (*functionPointer_t)(int*); void CallerFunc(functionPointer_t fp) { int arg = 0; fp(&arg); class MyClass { public: int myMemberFunc1(int *arg); }; int MyClass::myMemberFunc1(int *arg) { *arg = 100; return 0; } int main() { CallerFunc(&MyClass::myMemberFunc1); return 0; } VC2008编译错误如下: >error C2664: “CallerFunc”: 不能将参数1 从“int (__thiscall MyClass::* )(int *)”转换为“functionPointer_t” 为什么呢?从VC编译错误可以简单看出,成员函数地址与期望的函数指针类型不匹配。普通类成员函数的修饰符是 __thiscall,而C/C++全局函数的默认修饰符是 __cdecl。 更进一步来说:普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。