工程化编程实战callback接口学习笔记

工程化编程实战callback接口学习笔记

1.配置vscode c/c++调试编译环境,并运行lab5-1.tar.gz中的代码

按照老师上课所给出的vscode配置环境,但是我遇到了些问题,macOS下无法debug(通过clang++),在微软vscode也给出了解释,issue #3829 ,通过下载LLDB插件可以解决。

  • 编译代码

  • 运行代码

在执行quit命令,应该是执行退出程序,现在的结果和我们的预期不一样,所以对代码进行调试。

2.通过vscode+GDB调试程序,寻找quit的bug

调试前,先进行对代码的分析,大致定位代码bug的位置,那从main函数开始,main函数如下图:

有main中可知到,程序在quit输出This is a wrong cmd!,quit指令没有通过FindCmd在存储的链表中找到。

在进入SearchLinkTableNode

这个函数的功能就是链表中是否有满足Condition的命令,

这个conditon就是SearchConditon函数,完成的功能就是比对单个节点中保存的命令是否和我们要找的一致。

还有一个函数没有看就是在main中的InitMenuData

该函数实现链表的初始化,这里quit链表的最后一个位置。有前面的分析大致可以猜到可能是quit处于尾节点,由SearchLinkTableNode比对中没有比尾部节点,导致没有找到quit。

分析完后进入debug环节,

pLinkTable代表的就是链表数据结构,其中有三个节点,由InitMenuData给出,可以知道0x000...0000即使quit节点,

pTail也是指向该节点,那么就会导致存储quit节点丢失。有debug的结果可以清晰看到pNodepTail相等了。

修改函数SearchLinkTableNode为如下,就可以产生正确的结果了。

测试如下,

3.分析callback接口的运行机制,总结callback接口设计的方法

  • 计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码引用。这一设计允许了底层代码调用在高层定义的子程序。(这是维基百科定义)
  • 回调函数通常和原始调用者处于同意抽象层
  • 回调函数实现的多态的机制,通过注册不同的函数到同一个类的不同对象中,可以事项多态的机制。
  • 回调函数的实现方法
    • 在类中声明函数指针,可以对函数进行绑定
    • 类创建对象时,对对象中的函数指针进行绑定
    • 通过对象,调用绑定的函数,实现回调机制。

posted on 2020-03-16 19:33  humanyang  阅读(228)  评论(0编辑  收藏  举报

导航