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