读书人

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

发布时间: 2012-03-25 20:55:16 作者: rapoo

应用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中那个没有设置过的旧值,所以得到了错误的结果。

读书人网 >C++

热点推荐