木老师教笨笨课堂——系列讲座(从函数指针到委托)一 问题的由来

木老师教笨笨课堂——系列讲座(从函数指针到委托)
作者:李响 王双
本文示例在Visual C++ 6.0和 Visual Stdio2005下编译测试通过。
一、问题的由来
程序世界里面经常干的一件事情是模块A给模块B输入若干个参数,然后经过处理再输出一个结果返回给模块A。一般情况下A只需要把应该输入的参数准备好,然后等着模块B完成剩下的工作。可是有些时候B无法完成所有的工作需要获得A的帮助或者在完成工作的过程中他需要告诉A“我完成到什么地步”。这种特殊情况似乎很少见,其实不然。
比如,我去火车站买票,我告诉售票员我需要9月24日郑州到北京的火车票,售票员会告诉我有如下几种车票:
郑州到北京和谐号
6:54am——11:58am
213元
郑州到北京的快车
7:30am——14:50pm
94元
郑州到北京的K180
10:58pm——第二天6:30am
175元
.......
 
 
如果我想很快到达见我女朋友,我需要选择和谐号,如果我想尽可能的便宜可能会选择票价为94元的快车,如果我想不耽误白天的工作,则我可能选择睡一晚上到达等等。根据具体要求的不同我会选择最佳的车票。这个实际问题如何用程序语言描述呢?
模块A My 传参数 Time——2007年9月24日 Start City——郑州 End City——北京
模块B Ticket Seller 返回结果:一张合适的郑州到北京的火车票
这里很显然 模块A传给B的参数是不够的,实际情况是售票员会询问:“尊敬的顾客同志,今天从郑州到北京的火车票有和谐号、快车和晚上的K180,请问你要哪一张?”(当然售票员也可能说:“要哪一趟?啊 不知道,查清楚了再过来买,下一位”)。
模块和模块之间的通信确无法做到实际人与人这样的交流。因此A还需要传给B一个如何选择的依据。当然A可以传一个“我要见女朋友”,“我要省钱买房”或者“我要睡一觉”这样的参数。这可以用一个整数来表示,比如1表示“我要见女朋友”,2表示“我要省钱麦房”或者“我要睡一觉”。B在处理过程当中
B(Time,StartCity,EndCity,MyBestChoice)
switch(MyBestChoice)
{
case 1:
       return “郑州到北京和谐号”;
case 2:
return “郑州到北京的快车”;
case 3:
return “郑州到北京的K180”;
default:
       return “想清楚再来买,下一位”;
}
 
例1-1
问题似乎得到解决了,可是我的票买好了,而下一位想在北京转车去长春,下下一位需要中午回去给老婆弄饭。于是售票员的Swich....case越来越庞大(难怪售票员阿姨有时候心情不好 也真难为她们了。)于是售票员没有办法了,说:“你们给我一个选择的依据吧”。于是B变成为:
B(Time,StartCity,EndCity, MyBestChoice
{
// step1找到所有满足条件的票
// step2
bestTicket = MyBestChoice(Ticket[] ticket);
}
例1-2
这里的 MyBestChoice不再是一个简单的数,更确切地说他是一个行为而不是简单的数据。
吁!为了通俗形象,真是费劲啊。
在C语言里 行为我们往往是用函数表示,而这个行为和一般的行为不同 他是由模块B反过来调用模块A,因此称之为回调(call back)函数。

你可能感兴趣的:(函数指针)