指向类成员函数的指针 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];
}