指向类成员函数的指针 VS 一般函数指针
相同点
- 皆需指定其返回类型和参数列表;
- 目的均为方便调用;
不同点一
指向类成员函数的指针要标明它所指的是哪个类:
void (num_sequence::*pm)(int) = 0;
//pm指针就是指向的num_sequence这个类的成员函数
以上可以用typedef加以简化:
typedef void(num_sequence::*PtrType)(int);
PtrType pm = 0;
class num_sequence{
public:
typedef void(num_sequence::*PtrType)(int);
//_pmf可指向下列任何一个函数
void fibonacci(int);
void pell(int);
void lucas(int);
void triangular(int);
void sequence(int);
void pentagonal(int);
//...
private:
PtrType _pmf;
}
//取得某个成员函数的地址
PtrType pm = &num_sequence::fibonacci;
//同理,指定成员函数指针的值
pm=&num_sequence::triangular;
const int num_sequence::num_seq;
vector<vector<int> >num_sequence::seq(num_seq);//两个>之间必须有空格
num_sequence::PtrType num_sequence::func_tbl[num_seq]=
{ 0,
&num_sequence::fibonacci,
&num_sequence::pell,
&num_sequence::lucas,
&num_sequence::triangular,
&num_sequence::square,
&num_sequence::pentagona
};
不同点二
类成员函数指针须通过同类的类对象来加以调用,而此对象便是成员函数内this指针所指之物。
//举例
num_sequence ns;
num_sequence *pns=&ns;
PtrType pm=&num_sequence::fibonacci;
//为了通过ns调用_pmf:
(ns.*pm)(pos);
//.*是个成员选择指针运算符
//类对象指针专有的运算符:->*
(pns->*pm)(pos);
int num_sequence::elem(int pos)
{
if(!check_integrity(pos))
return 0;
if(pos>_elem->size())
(this->*_pmf)(pos);
return (*_elem)[pos-1];
}