【Effective C++】为类设计new_handler
来源:互联网 发布:河南千百知有限公司 编辑:程序博客网 时间:2024/06/05 08:26
如果我想在new调用出现异常时,捕捉住它而不是由于它而终止程序,那么就需要利用C++提供的set_new_handler函数,内部定义如下:
namespace std{typedef void (*new)handler)();new_handler set_new_handler(new_handler p) throw();}
为了不改变全局的new_handler可以这样设计:
class Widget{public:static std::new_handler set_new_handler(std::new_handler p) throw();static void* operator new(std::size_t size) throw(std::bad_alloc);private:static std::new_handler handler;};std::new_handler Widget::handler = 0;std::new_handler Widget::set_new_handler(std::new_handler p) throw(){std::new_handler old = handler;handler = p;return old;}
在设计operator new之前,先定义一个中间类,利用类析构函数的特性:
class NewHandlerHolder{public:explicit NewHandlerHolder(std::new_handler p):handler(p) {};~NewHandlerHolder(){std::set_new_handler(handler);}private:std::new_handler handler; };
operator new 设计如下:
void* Widget::operator new(std::size_t size) throw(std::bad_alloc){NewHandlerHolder tmp(std::set_new_handler(handler));return ::operator new(size);}
更一般地,我们可以将Widget泛化:
template<class T>class Widget{public:static std::new_handler set_new_handler(std::new_handler p) throw();static void* operator new(std::size_t size) throw(std::bad_alloc);private:static std::new_handler handler;};template<class T>std::new_handler Widget<T>::handler = 0;template<class T>std::new_handler Widget<T>::set_new_handler(std::new_handler p) throw(){std::new_handler old = handler;handler = p;return old;}template<class T>void* Widget<T>::operator new(std::size_t size) throw(std::bad_alloc){NewHandlerHolder tmp(std::set_new_handler(handler));return ::operator new(size);}那么,我们这样继承就能生成具备这种能力的类:
class Windows : public Widget<Windows>{};
或许你会疑问为什么T模板参数没用到,泛化作用在哪里?
原因来自基类都是静态函数!模板实例化针对不同的形参实例化。
0 0
- 【Effective C++】为类设计new_handler
- new_handler
- new_handler
- [翻译] Effective C++, 3rd Edition, Item 19: 视 class design(类设计)为 type design(类型设计)
- C++为class设置专属的new_handler
- Effective C++:类与函数的设计和申明
- Effective C++(四)设计与声明
- Effective C++(四)设计和声明
- [Effective C++] 继承与面向对象设计
- effective C++: 4.设计与声明
- Effective C++(四)接口设计与声明
- <<Effective C++>>读书笔记4: 设计与声明
- 《Effective C++》设计与声明章节
- 《Effective C++》继承与面向对象设计
- 《Effective C++》第四章:设计与声明
- More Effective C++ Item M33:将非尾端类设计为抽象类
- Effective C++(19) 设计class犹如设计type
- 读书笔记《Effective C++》条款19:设计class犹如设计type
- PAT-天梯赛-L1-019. 谁先倒
- TCP/IP的流量控制与拥塞控制机制
- 转载:QQ登录界面
- html (1)
- JAVA 对象引用,以及对象赋值
- 【Effective C++】为类设计new_handler
- Python机器学习开发环境搭建和GraphLab Create安装
- -------------GetObject详解
- SharedPreferences获取时报空指针异常,以及普通类中使用SharedPreferences存储数据
- 折半查找(二分法)
- Java中的异常 Exception
- IE11无法打开网页,一片空白,Internet选项灰色无法点击的问题
- 数据库 硬解析
- Redis