函数指针数组的例子

来看这么一段代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
 
enum response_type
{
	DUMP,
	SECOND_CHANCE,
	MARRIAGE
};
 
 
typedef struct
{
	char *name;
	enum response_type type;
}response;
 
 
void dump(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dump function\n");
}
 
 
void second_chance(response r)
{
	printf("Dear %s, \n", r.name);
	puts("second_chance function\n");
}
 
 
void marriage(response r)
{
	printf("Dear %s, \n", r.name);
	puts("marriage function\n");
}
 
 
int main()
{
	response r[] = {
		{"Mike", DUMP}, {"Luis", SECOND_CHANCE},
		{"Matt", SECOND_CHANCE}, {"William", MARRIAGE}
	};
 
	int index;
	for (index = 0; index < 4; index++)
	{
		switch (r[index].type)
		{
		case DUMP:
			dump(r[index]);
			break;
		case SECOND_CHANCE:
			second_chance(r[index]);
			break;
		case MARRIAGE:
			marriage(r[index]);
			break;
		default:
			break;
		}
	}
 
 
	return 0;
}


这个程序是可以执行的,并且是正确的。但是代码中充斥着大量的函数调用,每次都需要根据r的type来调用函数,看起来像这样:

		switch (r.type)
		{
		case DUMP:
			dump(r[index]);
			break;
		case SECOND_CHANCE:
			second_chance(r[index]);
			break;
		case MARRIAGE:
			marriage(r[index]);
			break;
		default:
			break;
		}

这么一来,如果增加r的第四种类型,那就不得不修改程序中每一个像这样的地方。很快,就有一大堆代码需要维护,而且这样很容易出错。



下面来看,如何通过创建函数指针数组来替代上面的这些代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
 
enum response_type
{
	DUMP,
	SECOND_CHANCE,
	MARRIAGE
};
 
 
typedef struct
{
	char *name;
	enum response_type type;
}response;
 
 
void dump(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dump function\n");
}
 
 
void second_chance(response r)
{
	printf("Dear %s, \n", r.name);
	puts("second_chance function\n");
}
 
 
void marriage(response r)
{
	printf("Dear %s, \n", r.name);
	puts("marriage function\n");
}
 
 
void (*replise[])(response) = { dump, second_chance, marriage };
 
 
int main()
{
	response r[] = {
		{"Mike", DUMP}, {"Luis", SECOND_CHANCE},
		{"Matt", SECOND_CHANCE}, {"William", MARRIAGE}
	};
 
	int index;
	for (index = 0; index < 4; index++)
	{
		replise[r[index].type](r[index]);
	}
 
 
	return 0;
}

可以看到,我们这里已经没有了那么一大段的switch代码。但是程序依然是和上边的初始程序一样的运行结果。

 

就这么一行代码,代替了上面的一大段switch代码!

 

那么我们现在来看增加r的第四种类型时候的代价:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
 
enum response_type
{
	DUMP,
	SECOND_CHANCE,
	MARRIAGE,
	DEAD
};
 
 
typedef struct
{
	char *name;
	enum response_type type;
}response;
 
 
void dump(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dump function\n");
}
 
 
void second_chance(response r)
{
	printf("Dear %s, \n", r.name);
	puts("second_chance function\n");
}
 
 
void marriage(response r)
{
	printf("Dear %s, \n", r.name);
	puts("marriage function\n");
}
 
 
void dead(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dead function\n");
}
 
 
void (*replise[])(response) = { dump, second_chance, marriage, dead };
 
int main()
{
	response r[] = {
		{"Mike", DUMP}, {"Luis", SECOND_CHANCE},
		{"Matt", SECOND_CHANCE}, {"William", MARRIAGE},
		{"Zeng", DEAD},
	};
 
	int index;
	for (index = 0; index < 5; index++)
	{
		replise[r[index].type](r[index]);
	}
 
 
	return 0;
}


对比一下,可以看到,仅仅需要修改3个地方,便能够加入一个对应的函数!维护代价大大的减少了!


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值