函数指针, 函数成员指针
// 函数指针的使用
#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;
}
#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
};
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 提高函数成员指针的声明的可读性。
如果有更简单的解决办法就不要使用函数成员指针。