gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:08:32 25 4
gpt4 key购买 nike

这段代码:

#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 中保存单例实例。我知道,如果我使用堆分配,它可能会起作用。但是这种风格有什么问题呢?问题出在哪里?

最佳答案

singleTon getSingleTon()
{
return s;
}

此函数的返回类型既不是引用也不是指针,因此您将返回 s 按值,这意味着您正在复制它并且返回拷贝。然而,如果你想修改存储在 myClass 中的 singleTon 的数据成员,你将希望通过引用返回(也可以通过指针返回,但通常如果没有必要,请气馁)。您的代码必须更改为如下所示:

singleTon& getSingleTon()
{
return s;
}

关于C++ 奇怪的问题。数据成员超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44029764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com