C++奇怪的问题.数据成员超出范围
C++ strange issue. Data member getting out of scope
此代码:
#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中得到一个单例的副本。
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 将私有数据成员添加到野牛生成的类中
- pImpl、范围和隐藏数据成员
- C++奇怪的问题.数据成员超出范围
- 范围视图作为数据成员
- 错误:非静态数据成员的使用无效,在此范围内未声明变量
- 为什么 C++ 类需要在类范围之外定义静态字段(数据成员)
- 数据成员是否形成一个范围
- c++ error:(私有数据成员)未在此范围内声明
- 声明类的数据成员的范围