例:
class test1;
class test;
typedef char (test::*PT)();
typedef int (test1::*PT1)();
class test1
{
public:
int R_1(){return 1;}
int R_2(){return 2;}
};
enum TR{R_a,R_b};
enum T1R{R_1,R_2};
test1 test_1;
class test
{
public:
//typedef char (test::*PT)();
//typedef int (test1::*PT1)();
void t_main(TR t,T1R t1){
PT pt[2]={&test::R_a, &test::R_b};
PT1 pt1[2]={&test1::R_1, &test1::R_2};
Show(pt[t],pt1[t1]);
}
void Show(PT pt,PT1 pt1){
cout<<(this->*pt)()<<"\n"<<(test_1.*pt1)();
}
char R_a(){return 'a';}
char R_b(){return 'b';}
};
void main()
{
test t;
t.t_main(R_a,R_2);
getch();
}
上面代码定义了2个class:test和test1,其中定义了2个类成员函数指针类型:
typedef char (test::*PT)();
typedef int (test1::*PT1)();
因为是在这2个类之前定义的成员函数指针类型,所以要在他前面加上这2个类的声明:
class test;
class test1;
例子中的这2个成员函数指针类型也可以定义在test类中; 我们来看看这2个成员函数指针类型定义的关键 (test::*PT) 这里的test::限定了PT所在的类,而一般的函数指针只需要(*PT)这样定义就可以了。
PT pt[2]={&test::R_a, &test::R_b};
PT1 pt1[2]={&test1::R_1, &test1::R_2};
定义了指向成员函数的指针表。
enum TR{R_a,R_b};
enum T1R{R_1,R_2};
TR,T1R是一个枚举类型,它提供了一组索引。
下面是另一个关键:
(this->*pt)() 和 (test_1.*pt1)();
类成员的指针必须总是通过特定的对象或指向该类类型的对象的指针来访问。我们通过使用两个指向
成员操作符的指针(针对类对象和引用的.*,以及针对指向类对象的指针的->*)来做到这一点。
因为pt指向的是test类中的成员函数,所以使用this指针来确定pt指向的成员函数所在的类,
而pt1指向的是test1类中的成员函数,所以要先定义一个test1对象(test_1)来确定pt指向的成员函数所在的类。