您的位置:首页 > 编程语言 > C语言/C++

用于继承的 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"

;
}
};

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都会抛出运行期异常,曾经有人提出过能不能在编译期识别出这些异常情况来,我认为是没有办法的,至少我没有想到过办法,当然,或许路过的各位高手有更好的解决办法,请指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: