此代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
class singleTon
{
float testVal;
public:
singleTon()
{
cout << "Singleton created\n";
testVal = 0.0;
}
~singleTon()
{
cout << "Singleton deleted\n";
}
void setTest(float x)
{
testVal = x;
}
float getTest()
{
return testVal;
}
};
class myClass
{
singleTon s;
public:
myClass()
{
cout << "myClass created\n";
}
~myClass()
{
cout << "myClass deleted\n";
}
singleTon getSingleTon()
{
return s;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
myClass m;
m.getSingleTon().setTest(100);
cout << "\ngetting" << m.getSingleTon().getTest();
cout << "\nSetting:";
m.getSingleTon().setTest(200);
cout << "\ngetting" << m.getSingleTon().getTest();
getchar();
return 0;
}
在第一个setTest()
之后:
m.getSingleTon().setTest(100);
单例类的析构函数被调用。
但是,为什么?
我的理解是它仍然会在class myClass
中保存单例实例。我知道,如果我使用堆分配,它可能会工作。但这种风格有什么问题?这个问题在哪里?
答案 0 :(得分:1)
singleTon getSingleTon()
{
return s;
}
此函数的返回类型既不是引用也不是指针,因此您将按值返回s
,这意味着您正在复制它并返回复印件。但是,如果要修改singleTon
中存储的myClass
的数据成员,您将希望通过引用返回(也可以通过指针返回,但如果不是,则通常不鼓励必要)。你的代码必须改为看起来像这样:
singleTon& getSingleTon()
{
return s;
}
答案 1 :(得分:0)
当你调用getSinglton()时,你实际上是在myClass中获得了一个单例的副本。