首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

应用Singleton模式时出现的一个疑问解决方案

2012-03-25 
应用Singleton模式时出现的一个疑问我原来的程序如下#includeiostreamusingnamespacestdclassCBomb{pri

应用Singleton模式时出现的一个疑问
我原来的程序如下
#include   <iostream>
using   namespace   std;

class   CBomb
{
private:
CBomb()
{
cout < < "构造函数 " < <endl;
test=99;
}


public:
static   CBomb   *_instance;
int   test,   test2;

void   setTest2()
{
test2   =   100;
}

static   CBomb*   Instance()
{
if(!_instance)
_instance   =   new   CBomb();
return   _instance;

}

};

CBomb*   CBomb::_instance   =   NULL;


void   main()
{
CBomb::Instance()-> setTest2();
int   t,t2;
t   =   CBomb::Instance()-> test;
t2   =   CBomb::Instance()-> test2;
cout < <t < < "   " < <t2 < <endl;

}
此时的输出是对的。

但是,当我把
static   CBomb*   Instance()
{
if(!_instance)
_instance   =   new   CBomb();
return   _instance;

}
函数改为
static   CBomb   Instance()
{
if(!_instance)
_instance   =   new   CBomb();
return   *_instance;

}
后面也把-> 改为.以后,输出的test2的值就是错误的了,
为什么呢?



[解决办法]
static CBomb Instance()

应该改为

static CBomb& Instance()

前一种写法是值返回,会调用CBomb的copy constructor产生一个临时对象作为返回值.
所以当你setTest2()时,你是设置在一个临时对象上,而不是*instance上。
而当你读区test2时,你是在访问另一个copy自*instance的临时对象,它的test2值仍然是*instance中那个没有设置过的旧值,所以得到了错误的结果。

热点排行