C++奇怪的问题.数据成员超出范围

C++ strange issue. Data member getting out of scope

本文关键字:范围 数据成员 问题 C++      更新时间:2023-10-16

此代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
class singleTon
{
float testVal;
public:
singleTon()
{
cout << "Singleton createdn";
testVal = 0.0;
}
~singleTon()
{
cout << "Singleton deletedn";
}
void setTest(float x)
{
testVal = x;
}
float getTest()
{
return testVal;
}
};
class myClass
{
singleTon s;
public:
myClass()
{
cout << "myClass createdn";
}
~myClass()
{
cout << "myClass deletedn";
}
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中保存单例实例。我知道,如果我使用堆分配,它可能会起作用。但是这种风格有什么问题呢?问题出在哪里?

singleTon getSingleTon()
{
return s;
}

此函数的返回类型既不是引用也不是指针,因此您将按值返回s,这意味着您正在创建它的副本并返回副本。但是,如果要修改存储在myClass中的数据成员singleTon,则需要改为通过引用返回(也可以通过指针返回,但如果没有必要,通常不鼓励这样做)。您的代码必须更改为如下所示:

singleTon& getSingleTon()
{
return s;
}

当你调用getSinglton()时,你实际上是在myClass中得到一个单例的副本。