昨晚本想把前晚说的 用虚函数地址实现一些函数回调学习一下.但是昨晚到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()