函数指针, 函数成员指针

// 函数指针的使用
#include <iostream>
using namespace std;

enum BOOL { FALSE, TRUE };

class Dog {
public:
    
void Speak() const { cout << "woof!\n"; }
    
void Move() const { cout << "Walking to heel\n"; }
    
void Eat() const { cout << "Gobbling food\n"; }
    
void Growl() const { cout << "Grrrrr\n"; }
    
void Whimper() const { cout << "Whining noises\n"; }
    
void RollOver() const { cout << "Rolling over\n"; }
    
void PlayDead() const { cout << "Is this the end of Little Caeser? \n"; }
}
;

typedef 
void (Dog::*PDF) () const;

int main(int argc, char* argv[]) {
    
const int MaxFuncs = 7;    
    
    PDF DogFunctions[MaxFuncs] 
= {
        
&Dog::Speak,
        
&Dog::Move,
        
&Dog::Eat,
        
&Dog::Growl,
        
&Dog::Whimper,
        
&Dog::RollOver,
        
&Dog::PlayDead
    }
;
    
    Dog
* pDog = 0;
    
int member;
    BOOL fQuit 
= FALSE;
    
    
while (!fQuit) {
        cout 
<< "(0) Quit (1) Speak (2) Move (3) Eat (4) Growl";
        cout 
<< " (5)Whimper (6) Roll Over (7) Play Dead:";
        cin 
>> member;
        
        
if (member == 0{
            fQuit 
= TRUE;
            
break;
        }

        
else {
            pDog 
= new Dog;
            (pDog
->*DogFunctions[member - 1]) ();
            delete pDog;
        }

    }

    
    
return 0;
}


这个代码里数组定义原来是

    PDF DogFunctions[MaxFuncs] = {
        Dog::Speak,
        Dog::Move,
        Dog::Eat,
        Dog::Growl,
        Dog::Whimper,
        Dog::RollOver,
        Dog::PlayDead
    }
;

在 gcc 下编译不能通过, 改成加一个 & 就通过了。
引用书上的一段解释:

函数指针不需要取消对它的引用。因此,如果 pFunc 是一个整参数、返回 long 型变量的函数指针,而且程序给 pFunc 分配了匹配的函数,程序用 pFunc(x); 或 (*pFunc)(x) 都可以调用该函数。 两种格式效果是一样的,前者比后者简单。

用 vc 编译则加不加 & 都可以通过。
看来是 vc 和 gcc 对 c++ 标准支持的程度不同导致的。

要/不要

对类的特定对象调用函数成员指针。
使用 typedef 提高函数成员指针的声明的可读性。
如果有更简单的解决办法就不要使用函数成员指针。

posted on 2005-04-29 14:57  NeilChen  阅读(747)  评论(0编辑  收藏  举报

导航