2015-11-24
什么情况下,想到将函数指针数组来的呢?是由于近期写的一个程序中,有一系列顺序化的函数,且这些函数的形式基本一致,需要对每一步的执行结果进行判断,是否执行成功,若执行成功,则继续执行下一函数,如果执行失败,则终端执行并退出。
由于依次要执行的函数比较多,有5个。按照常规思路来写代码的话,就是对每一步执行的结果进行IF-ELSE判断,根据结果决定下一步执行的内容。目前只有5个函数需要执行,如果有更多类似的函数需要按顺序执行的话,那么这个函数将会非常长,不便于阅读,代码也不美观。
考虑到当前使用的函数的参数列表和返回值基本一致,因此考虑是否可以采用遍历函数指针数组的方式,把函数指针存放到数组中,遍历数组,从而依次执行对应指针指向的函数,并对结果逐一判断,并做相应处理。这样对结果处理部分可以采用统一的方式,判断非常方便,代码也非常简洁清晰,阅读起来也比较容易。
于是上网查询相关资料,了解函数指针数组的使用方法。通过查询资料,C++函数指针数组的使用可以分为两类,一类是全局函数的指针数组的使用(与C语言相同),另一类是C++类的成员函数指针数组的使用。现就这两种情况分别进行整理。
1. 要求被调用的一系列函数的参数列表和返回值类型均完全一致;
2. 要求将所要调用的函数指针放入函数指针数组中(如果函数必须含顺序执行,那么函数指针的存放顺序需要与调用的顺序保持一致);
3. 调用时,从数组中取出要执行的函数指针,执行对应的函数即可。
参考自:http://blog.csdn.net/feitianxuxue/article/details/7300291
#include
using namespace std;
void function0(int);
void function1(int);
void function2(int);
int _tmain(int argc, _TCHAR* argv[])
{
void (*f[3])(int) = {function0,function1,function2}; //将这3个函数指针保存在数组f中
intchoice;
cout<< "Enter a number between 0 and 2,3 to end: ";
cin>> choice;
//处理用户的选择
while((choice >= 0) && (choice <3))
{
//调用数组f中的一个函数
(*f[choice])(choice); //f[choice]选择在数组中位置为choice的指针。
//指针被解除引用,以调用函数,并且choice作为实参传递给这个函数。
cout<< "Enter a number between 0 and 2,3 to end: ";
cin>> choice;
}
cout<< "Program execution completed." << endl;
system("pause");
return0;
}
void function0(int a)
{
cout<< "You entered" << a << " so function0 wascalled\n\n";
}
void function1(int b)
{
cout<< "You entered" << b << " so function1 wascalled\n\n";
}
void function2(int c)
{
cout<< "You entered" << c << " so function2 wascalled\n\n";
}
C++类中的成员函数指针数组使用时,与C的使用方法不同。要求如下:
1. 要求放入函数指针数组的成员函数的参数列表和返回值类型均完全一致;
2. 定义一个函数指针数组,且指定数组长度(等于要存放的成员函数的个数),并在初始化时将成员函数指针赋给对应的数组变量中(如果函数必须含顺序执行,那么函数指针的存放顺序需要与调用的顺序保持一致);
3. 调用时,从数组中取出要执行的函数指针,执行对应的函数即可。调用时要使用“->*”或“.*”来指向数组元素,否则编译时会报错。
参考自:http://www.cppblog.com/dragon/archive/2010/12/02/135250.html
/*
*测试成员函数指针数组的小程序
*代码关键点已经用红色标注
*/
#include
using namespace std;
class Test
{
public:
Test();
~Test();
private:
void add5(){ res+=5;}
void add6(){ res+=6;}
//这个2至关重要,在VC下没写会报错,但在QT里没报,但析构时出错!
void (Test::*add[2])();
public:
void DoAddAction();
void Display();
private:
int res;
};
Test::Test()
{
//注意这里的写法
add[0]=&Test::add5;
add[1]=&Test::add6;
res=0;
}
Test::~Test()
{
}
void Test::DoAddAction()
{
for (int i=0;i<2;i++)
{
//使用类成员函数指针必须有“->*”或“.*”的调用
(this->*add[i])();
}
}
void Test::Display()
{
cout<<"The res is:"< } int main() { Test * test=new Test(); test->DoAddAction(); test->Display(); delete test; return 0; } 以上方法,说明了在C和C++类中使用函数指针数组的方法,显而易见,使用函数指针数组的方法,可以较为方便地调用函数,且使得代码简洁美观,代码质量提供一个档次。 在今后的程序开发过程中,遇到类似的问题,在可以使用函数指针数组的情况下,可以尝试只有函数指针数组,让开发工作变得更容易,更有乐趣。四、 总结