关于回调函数的讲解.pdf

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于回调函数的讲解.pdf

关于回调函数的讲解 关于回调函数 杨四郎 QQ 1041682343 §1 回调函数的定义 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址) 作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就 说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件 或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 §2 两种常见的回调函数形式 §2.1 直接形式 在Linux 平台上编程时,遇到的最常见的需要用到回调函数是的线程创建函 数和信号处理函数。这二者的原型分别如下: 其中线程创建函数中,第三个参数就是一个函数指针,我们需要定义一个形 参为void * ,返回值也为void * 的函数,并将该函数名传递给线程创建函数,此 时,该函数就是一个回调函数。 线程创建函数举例如下,信号处理函数道理类似,不再举例。 1 关于回调函数的讲解 §2.2 间接形式 在实际项目开发中,回调函数的间接形式用得是比较多的。考虑下面这种情 况:在一个大型软件项目中,为了逻辑清晰、维护方便,通常进行分层设计,即 上层模块可以调用下层模块,但是下层模块不能直接调用上层模块,如下图所示。 2 关于回调函数的讲解 top 模块依赖于middle 模块和bottom 模块,middle 模块依赖于bottom 模块, 不能反向依赖。然而,在实际的编码过程中,确实经常会遇到 middle 模块需要 调用top 模块的一些函数和变量的情况。比如说,middle 模块的classC 组件需要 调用top 模块classB 组件的一个函数,如下 (为了方便表述,我把函数的实现写 在类里面了): 显然,这已经违背了层次化设计的初衷了,如果代码中存在大量这种情况, 那么逻辑将会十分的混乱,后期维护特别困难。 有没有一种方法,可以避免这个反向调用呢?答案是肯定的,那就是利用回 调函数。对于上面那个例子,我们可以让 middle 模块的classC 提供一个注册回 调函数的接口,在top 模块中将回调函数(即此时的getValue() 函数)注册进去, 3 关于回调函数的讲解 代码如下: 采用这种回调函数方式,完成同样的功能,但是你将再也不会看到有middle 模块的classC 组件调用top 模块的classB 组件的情况了。表面上看来,依然是top 模块调用middle 模块,用户只需要保证在调用classC 的doSometing()函数之前调 用了classB 的register()函数即可。不会出现混乱逻辑的反向依赖。 其实,在同一层次的代码之间也可以使用回调,来使得代码结构清晰。 §2.3 回调函数的另一种用途 最后,不得不指出的是,在间接形式中,回调函数还有一种用途。 因为回调函数机制可以把调用者与被调用者分开,所以调用者不关心谁是被 调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之, 回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便 该函数在处理相似事件的时候可以灵活的使用不同的方法。 举个例子,将设有这样一种情况:我们从前端摄像头读到了数据,接下来需 要对该数据进行处理,然而针对不同的协议有不同的处理方式。这个时候我们可 以将每一个处理方式的函数都写成一个函数,在我们决定使用哪个处理方式的时 候就将对应的回调函数注册进去。代码如下: (1) 首先是一个需要处理数据的类,这个类目前并不知道它将要用什么方式处理 数据,它只知道它在保存数据之前一定要处理数据。如下: 4

文档评论(0)

tangtianbao1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档