C++函数对象的应用
来源:互联网 发布:淘宝天下 电话号码 编辑:程序博客网 时间:2024/06/10 12:08
假如我们实现了这样的一个单向链表:
class LinkedListNode{ int data_; LinkedListNode *next_;};class LinkedList{ public: void insert(LinkedListNode* &p); void del(LinkedListNode *p); private: LinkedListNode *head_;};
其中insert将p插入到head_为头指针的链表中,而p对应的内存由外面分配好,调用的时候类似于这样:
LinkedList list;LinkedListNode *p = new LinkedListNode(2, NULL);list.insert(p);
其中,p可能是通过new得到,也可能是malloc出来。好,问题来了:
这个类的del函数应该如何实现呢?如果节点是new出来的,我们得delete;如果是malloc出来的,我们得使用配套的free。否则,行为就是undefined。而且,用户还可能实现了自己的定制的内存分配回收例程。我们并不知道该内存是如何分配得到的。这就是问题所在。
解决方法是让用户将正确的、对应的、适配的资源释放例程传递进来,然而delete是expression,free是函数,更悲剧的是不同用户实现的资源回收函数原型不尽相同。如何做呢?函数对象是解决这个问题的利器。我们可以这样:
template<typename CallBack>class LinkedList{ public: void insert(LinkedListNode* &p); void del(LinkedListNode *p); private: LinkedListNode *head_;};
在del中:
void del(LinkedListNode *p){ //... LinkedListNode *prev = get_prev(p); prev->next_ = p->next_; CallBack cb; cb(p);//调用用户提供的资源回收例程}
用户需要实现自己的CallBack类的operator()成员函数。如下所示:
class MyReclaimRoutine{ public: void operator() (LinkedListNode *p) { delete p; //free(p) ? my_release_func(p) ? all up to you! }};
然后就万事大吉了:
LinkedList<MyReclaimRoutine> list;LinkedListNode *p = new LinkedListNode(2, NULL);list.insert(p);list.del(p);//ok! delete p will be called
0 0
- C++函数对象的应用
- C时间函数的应用
- [C++] 函数指针的应用
- 浅谈C的函数应用
- C语言函数的应用
- 【day0407 C++】文件流对象的应用
- C 类对象的拷贝构造函数
- C++:指向对象成员函数的指针
- 函数指针与C的面向对象
- 【C++】对象函数的覆盖、重载、多态
- C语言中随机函数的应用
- 深入剖析C 重载函数的应用
- 栈的应用-函数调用(C版)
- c语言中函数指针的应用
- c语言的strcmp函数应用实例
- 【C++】纯虚函数的简单应用。
- 【c++】函数模板的简单应用
- c/c++ 宏函数的应用
- HDU 1221
- 面向对象
- shiro 使用缓存时出现:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource
- 国家城市二级联动jsp页面
- 仅需五步,制作专属你的网站
- C++函数对象的应用
- Retrofit初体验
- 完全搞定iframe(框架)里的滚动条
- Java 集合框架源码分析(三)——HashMap
- Android Material Design系列之CollapsingToolbarLayout
- 我的spark学习之路(一)
- HandlerThread使用总结
- 23种设计模式C++实例之观察者模式
- CodeForces 589B -- B. Layer Cake(多重集合+技巧枚举)