用于继承的 singleton (在C++中)
2004-04-07 22:24
676 查看
DP中提出的singleton模式不可以被用来当做继承基类的,每次要按照singleton的规则来设计一个singleton类是很痛苦的事,特别是当程序中singleton频繁出现的时候。MCD中的singleton也是外包的,这是一个singleton被用做基类的实现,不过跟语言相关了,用在C++中是没有问题的。
下面是该模板类的实现:
template<class SubClass>
class Singleton
{
private:
static SubClass *_instance;
static bool _create_by_instance;
public:
static SubClass * Instance();
protected:
Singleton()
{
if(!_create_by_instance)
throw std::runtime_error ("can't create object by subclass"
![](http://blog.csdn.net/Develop/ArticleImages/26/26448/CSDN_Dev_Image_2004-4-5917011.gif)
;
}
};
template<class SubClass>
SubClass * Singleton<SubClass>::Instance ()
{
if( _instance == 0)
{
_create_by_instance = true; //表明调用者身份
//异常处理
try
{
_instance = new SubClass();
}
catch(...)
{
_create_by_instance = false; //注销调用者身份
}
_create_by_instance = false; //注销调用者身份
}
return _instance;
}
template<class SubClass>
SubClass * Singleton<SubClass>::_instance = 0;
template<class SubClass>
bool Singleton<SubClass>::_create_by_instance = 0;
使用情况很简单:
class Machine : public Singleton<Machine> {...};
client 如果这样:Machine obj;
或者:Machine *pMch = new Machine;
Singleton都会抛出运行期异常,曾经有人提出过能不能在编译期识别出这些异常情况来,我认为是没有办法的,至少我没有想到过办法,当然,或许路过的各位高手有更好的解决办法,请指出。
下面是该模板类的实现:
template<class SubClass>
class Singleton
{
private:
static SubClass *_instance;
static bool _create_by_instance;
public:
static SubClass * Instance();
protected:
Singleton()
{
if(!_create_by_instance)
throw std::runtime_error ("can't create object by subclass"
![](http://blog.csdn.net/Develop/ArticleImages/26/26448/CSDN_Dev_Image_2004-4-5917011.gif)
;
}
};
template<class SubClass>
SubClass * Singleton<SubClass>::Instance ()
{
if( _instance == 0)
{
_create_by_instance = true; //表明调用者身份
//异常处理
try
{
_instance = new SubClass();
}
catch(...)
{
_create_by_instance = false; //注销调用者身份
}
_create_by_instance = false; //注销调用者身份
}
return _instance;
}
template<class SubClass>
SubClass * Singleton<SubClass>::_instance = 0;
template<class SubClass>
bool Singleton<SubClass>::_create_by_instance = 0;
使用情况很简单:
class Machine : public Singleton<Machine> {...};
client 如果这样:Machine obj;
或者:Machine *pMch = new Machine;
Singleton都会抛出运行期异常,曾经有人提出过能不能在编译期识别出这些异常情况来,我认为是没有办法的,至少我没有想到过办法,当然,或许路过的各位高手有更好的解决办法,请指出。
相关文章推荐
- WTL for MFC Programmers(3)
- 聊聊我对c/c++的认识
- Thinking in C++ 卷2中文版
- thinkng in c++卷2
- thinking in c++ 卷2
- thinking in c++卷2
- 便利的开发工具 CppUnit 快速使用指南
- 便利的开发工具-log4cpp快速使用指南
- Write COM using only C++
- 用C语言实现UCS-2和UTF-8之间的互相转化
- C++的profile辅助模板类 升级版
- C++的profile辅助模板类
- 用C++实现C#中的委托/事件(标准C++之升级版)
- 闲谈C++算法封装:穷举法
- 连上comp.lang.c++了
- 我的Visual C++入门之路——N次失败与1次成功
- 我的Visual C++入门之路——N次失败与1次成功
- 我的Visual C++入门之路——N次失败与1次成功
- 我的Visual C++入门之路——N次失败与1次成功
- 用 C++ 实现 C# 中的 委托/事件 (5-functor2)