更为有趣的结构是函数指针
使用一个函数,只有用下标就可使用
使用下标,就使用指针
这种方式支持表格式驱动码 table-driven code
表格式驱动码根据状态变量来选择被执行的函数
表格式驱动码不用条件语句和case语句
表格式驱动码经常要从表添加或删除函数
表格式驱动码想动态地创建或改变表
预处理宏创建 哑函数,然后使用自动聚合初始化功能
当希望创建一些解释器或表处理程序时,可以想象技术是多么的有用
输出
press a key from 'a' to 'g' or q to quit
a
function a called...
press a key from 'a' to 'g' or q to quit
b
function b called...
press a key from 'a' to 'g' or q to quit
c
function c called...
press a key from 'a' to 'g' or q to quit
d
function d called...
press a key from 'a' to 'g' or q to quit
e
function e called...
press a key from 'a' to 'g' or q to quit
f
function f called...
press a key from 'a' to 'g' or q to quit
g
function g called...
press a key from 'a' to 'g' or q to quit
h
press a key from 'a' to 'g' or q to quit
使用一个函数,只有用下标就可使用
使用下标,就使用指针
这种方式支持表格式驱动码 table-driven code
表格式驱动码根据状态变量来选择被执行的函数
表格式驱动码不用条件语句和case语句
表格式驱动码经常要从表添加或删除函数
表格式驱动码想动态地创建或改变表
预处理宏创建 哑函数,然后使用自动聚合初始化功能
自动聚合初始化功能指向函数的指针数组
//: C03:FunctionTable.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Using an array of pointers to functions
#include <iostream>
using namespace std;
// A macro to define dummy functions:
#define DF(N) void N() { \
cout << "function " #N " called..." << endl; }
DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);
void (*func_table[])() = { a, b, c, d, e, f, g };
int main() {
while(1) {
cout << "press a key from 'a' to 'g' "
"or q to quit" << endl;
char c, cr;
cin.get(c); cin.get(cr); // second one for CR
if ( c == 'q' )
break; // ... out of while(1)
if ( c < 'a' || c > 'g' )
continue;
(*func_table[c - 'a'])();
}
} ///:~
从表中添加和删除函数 只需要改变少量代码
当希望创建一些解释器或表处理程序时,可以想象技术是多么的有用
输出
press a key from 'a' to 'g' or q to quit
a
function a called...
press a key from 'a' to 'g' or q to quit
b
function b called...
press a key from 'a' to 'g' or q to quit
c
function c called...
press a key from 'a' to 'g' or q to quit
d
function d called...
press a key from 'a' to 'g' or q to quit
e
function e called...
press a key from 'a' to 'g' or q to quit
f
function f called...
press a key from 'a' to 'g' or q to quit
g
function g called...
press a key from 'a' to 'g' or q to quit
h
press a key from 'a' to 'g' or q to quit