在C++中,成员函数的指针一般是这么用的,
view plaincopy to clipboardprint?
#include <stdio.h>
class A{
public:
char hello(int a){
printf("hello world");
return a-'0';
}
};
typedef char (A::*PTRFUN)(int);
int main()
{
A* obj=new A();
PTRFUN pFun= &A::hello;
(obj->*pFun)(2);
return 0;
}
#include <stdio.h>
class A{
public:
char hello(int a){
printf("hello world");
return a-'0';
}
};
typedef char (A::*PTRFUN)(int);
int main()
{
A* obj=new A();
PTRFUN pFun= &A::hello;
(obj->*pFun)(2);
return 0;
}
但你可能遇到这样的情况,C++要将对象和函数指针传递给c,然后由c去调用,你可能会这么做:
void invokeFunc(void* obj,void* pfunc)
{
A* class_obj=(A*)obj;
PTRFUN pFun=(PTRFUN)pfunc;
(class_obj->*pFun)(2);
}
int main()
{
A* obj=new A();
PTRFUN pFun;
pFun = &A::hello;
invokeFunc(obj,pFun);
}
但是你会发现编译器会对PTRFUN pFun=(PTRFUN )pfunc;报错,你可以这样做:
view plaincopy to clipboardprint?
#include <stdio.h>
class A{
public:
char hello(int a){
printf("hello world");
return a-'0';
}
};
typedef char (A::*PTRFUN)(int);
void invokeFunc(void* obj,void* pfunc)
{
A* class_obj=(A*)obj;
PTRFUN* pFun2=(PTRFUN*)pfunc;
PTRFUN pFun=*pFun2;
(class_obj->*pFun)(2);
}
int main()
{
A* obj=new A();
PTRFUN pFun;
pFun = &A::hello;
invokeFunc(obj,&pFun);
return 0;
}
#include <stdio.h>
class A{
public:
char hello(int a){
printf("hello world");
return a-'0';
}
};
typedef char (A::*PTRFUN)(int);
void invokeFunc(void* obj,void* pfunc)
{
A* class_obj=(A*)obj;
PTRFUN* pFun2=(PTRFUN*)pfunc;
PTRFUN pFun=*pFun2;
(class_obj->*pFun)(2);
}
int main()
{
A* obj=new A();
PTRFUN pFun;
pFun = &A::hello;
invokeFunc(obj,&pFun);
return 0;
}
也就是将一级指针转换为2级指针,这样编译就不会读void*转成员函数指针进行报错。