用于继承的 singleton (在C++中)

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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都会抛出运行期异常,曾经有人提出过能不能在编译期识别出这些异常情况来,我认为是没有办法的,至少我没有想到过办法,当然,或许路过的各位高手有更好的解决办法,请指出。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航