使用局部函数作为回调函数(未实现)

本文探讨了尝试使用虚函数地址作为回调函数的思路,旨在避免全局变量和多线程问题。作者通过实验发现,添加参数会导致调用堆栈异常,因为虚函数表只有一份且与对象的`this`指针关联。虽然找到了通过`void*`规避`this`指针的方法,但这种方法在调试时会触发断言。这次尝试加深了对回调函数和C++运行时堆栈的理解,但尚未找到理想解决方案。
摘要由CSDN通过智能技术生成

昨晚本想把前晚说的 用虚函数地址实现一些函数回调学习一下.但是昨晚到12点我都没搞出来,就拖到今天了.

先说一下为何我会产生这样的需求吧.在工作做会经常使用回调函数,比如调用rtree进行搜索,然后搜到得结果会调用回调函数进行处理.比如调用rtree的目的是收集符合条件的id,那么,此时就需要声明个全局变量集合来保存id,然后调用完再将结果转移.更好一点的做法可能是声明个全局的类指针,在调用rtree进行搜索之前先令其等于this,然后再在函数里面直接通过该指针进行赋值,可以直接到位,减少拷贝和内存消耗.在没有多线程的情况下,这样做也是挺不错的.但是如果存在多线程,这样就不行了,用全局变量就就会混在一起,无法得到正确的结果.

如果我们能用局部函数作为回调函数的话,则又无效率损耗也无多线程的问题,这简直太棒了.加之之前对虚函数地址的了解,在脑海里面已经把整个过程都走通了,然而too yong too simple,事情远没我想的这么简单.

按照我之前的设想,我可以通过查虚函数表,然后得到虚函数的地址,然后把地址作为函数指针的参数传入需要回调的函数,在里面调用这个函数.为此,我写了个测试,关键代码如下

typedef void(*CallBack)(void);

class RTree{

public:

         voidsearchOverlap(CallBack c) { c(); }

};

class CallRtree{

public:

         virtualvoid searchRes() {  std::cout <<"123" << std::endl;  }

         voidsearch()

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值