指向成员函数的函数指针

C语言中的函数指针还是很简单的,这里还是稍微总结一下:

  • 函数地址:
        函数名,&函数名,两者均可。
  • 函数指针变量的定义方法:
        把函数名替换为你喜欢的变量名,并在前面加*号,并把*号和函数名()起来。
  • 函数指针类型的定义方法:
        把上一步的变量名替换为你喜欢的类型名,前面再直接加typedef即可。

例子:

(1) 函数定义如下:

char *parseFrame(char* frame, int len);

(2) 定义一个函数指针变量pFunc指向parseFrame这个函数:

char *(*pFunc)(char* frame, int len);
pFunc = parseFrame;

(3) 定义一个函数指针类型ParseFunc,并用这个类型定义一个函数指针变量pFunc,指向parseFrame这个函数:

typedef char *(*ParseFunc)(char* frame, int len);
ParseFunc pFunc;
pFunc = parseFrame;

 

 

在C++中,要想写一个指向成员函数的函数指针,以上知识就不够用了。

  • 成员函数地址为:
        &类名::成员函数名,与上面的C语言风格相比,这里必须要加&符号。
  • 指向成员函数的函数指针变量的定义方法:
         把函数名替换为你喜欢的变量名,前加上【类名::*】,并把【类名::*变量名】用()括起来。
  • 指向成员函数的函数指针类型的定义方法:
          把上一步的变量名替换成你喜欢的类型名,并在前面加typedef。

例子:

(1)定义成员函数readAge:

class Person
{
public :
    int readAge(void);
}

(2)定义函数指针变量pFunc指向readAge函数:

int (Person::*pFunc)(void);
pFunc = &Person::readAge;

(3)定义函数指针类型Person::ReadFunc,并用这个类型定义一个函数指针变量pFunc ,指向readAge这个成员函数

typedef int (Person::*ReadFunc)(void);
Person::ReadFunc pFunc =  &Person::readAge;

类型名也可不带类名前缀,简写为:ReadFunc

(4)在本类的别的成员函数中通过函数指针变量pFunc ,调起readAge这个成员函数

Person::ReadFunc pFunc =  &Person::readAge;
int a = (this->*pFunc)();

(5)在类外,通过函数指针, 调起这个成员函数

Person tom;
Person::ReadFunc pFunc =  &Person::readAge;
int a = (tom.*pFunc)();

(6)常见编译错误:
由上面(4/5)两点可见,用函数指针调起成员函数,必须要有对象操作,具体来说就是体现为【this->】或者【obj.】或者【pObj->】,而不能像C语言一样,直接用函数指针调用,例如上面第(4)条,如果按C语言的方法来写:
Person::ReadFunc pFunc =  &Person::readAge;
int a =pFunc();//这一行按照C语言语法来看,没毛病,但在C++中编译报错
编译错误提示为:error: C2064: 项不会计算为接受 xx 个参数的函数。(博主注:xx等于你传入的实参数目)

这个编译错误对程序员来说,过于隐晦,让人不明所以,感觉驴头不对马嘴,这里特意记录一下。
 

发布了124 篇原创文章 · 获赞 214 · 访问量 30万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章