【发布时间】:2017-10-17 04:56:44
【问题描述】:
这段代码:
#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 中保存单例实例。我知道,如果我使用堆分配,它可能会起作用。但是这种风格有什么问题呢?问题出在哪里?
【问题讨论】:
-
您按价值返回,这意味着您每次都在制作副本。您需要通过引用返回。
-
删除你的单例的复制构造函数,你会看到你的错误。
-
您似乎误解了应该如何实现real singleton pattern
标签: c++ scope static allocation