类成员的指针 classname::*member, (classname::*pf)()

回顾:

普通函数指针定义
1 int (*pfi)()

问题提出:
假设有如下类
1 class Screen
2 {
3 public:
4     int height() { return _height; }
5     int width() { return _width; }
6 //.
7 }

现在这样赋值
1 pfi = &Screen::height;
2 //非法赋值,类型违例

因为指向成员函数指针包含三个方面:1)参数表(个数、类型)  2)返回类型   3) 所属类类型
而普通的指向函数指针只包含两个方面

正确的指向成员函数指针定义:
1 int (Screen::*pmf)();
2 pmf = &Screen:height;
3 
4 
为避免复杂的指针类型,使用typedef
1 typedef int (Screen *PTR_TYPE)();
2 PTR_TYPE pmf = &Screen::height;


注意classname::* 语法

指向类成员的指针的使用:
 1 int (Screen::*pmf)() = &Screen::height;
 2 Screen myScreen, *bufScreen;
 3 
 4 //直接调用成员函数
 5 if(myScreen.height() == bufScreen->height())
 6 //
 7 
 8 //通过成员函数指针的等价调用
 9 if((myScreen.*pmf)() == (bufScreen->*pmf)())
10 //



同样道理,指向数据成员指针:
1 int Screen::* ps_screen = &_height


总结:与普通指针比较,加上classname::*



static成员的指针:
我们知道,静态类成员属于该类的全局对象和函数,它们的指针是普通指针(请记住static成员函数没用this指针)

 1 class classname
 2 {
 3 public:
 4    static void rai(double incr);
 5    static double interest() { };
 6    //
 7 private:
 8    static double _interestRate;
 9    string _owner;
10 }
11 
12 //ok
13 double *pd = &classname::_interestRate;
14 //error
15 double classname::*pd = &classname::_interestRate;
16 
17 //ok
18 double (*pfunc)() = &classname::interest;
posted @ 2007-06-07 01:39  中土  阅读(728)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.