工程化编程实战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的结果可以清晰看到pNode
和pTail
相等了。
修改函数SearchLinkTableNode
为如下,就可以产生正确的结果了。
测试如下,
###3.分析callback接口的运行机制,总结callback接口设计的方法
- 在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。(这是维基百科定义)
- 回调函数通常和原始调用者处于同意抽象层
- 回调函数实现的多态的机制,通过注册不同的函数到同一个类的不同对象中,可以事项多态的机制。
- 回调函数的实现方法
- 在类中声明函数指针,可以对函数进行绑定
- 类创建对象时,对对象中的函数指针进行绑定
- 通过对象,调用绑定的函数,实现回调机制。