我正在练习c ++ OOP并且我希望在使用公共函数设置它之后更新类中的私有变量但是什么也没发生。这是代码。
#include <iostream>
using namespace std;
class HideAndSeek
{
private:
string isHidden = "N";
public:
string getHiddenStatus()
{
string hiddenStatus = isHidden;
return hiddenStatus;
}
void setHiddenStatus(string hiddenStatus)
{
isHidden = hiddenStatus;
}
};
int main()
{
HideAndSeek yayOrNay; //HideAndSeek object instance
string f = yayOrNay.getHiddenStatus(); //Gets the value of private isHidden in HideAndSeek class
cout << f << endl; //Value of f should be "N"
yayOrNay.setHiddenStatus("Y"); //This should set isHidden to "Y"
cout << f << endl; //Value of f should now be "Y"
}
字符串变量f输出&#34; N&#34;在这两种情况下,即使它的价值应该改为&#34; Y&#34;与
yayOrNay.setHiddenStatus("Y");
我也发现了打电话
yayOrNay.getHiddenStatus()
再次变量f
f = yayOrNay.getHiddenStatus();
产生适当的输出,但我认为更新变量值的步骤太多了。有人可以帮忙指出我的错误吗?
答案 0 :(得分:5)
getHiddenStatus
会返回副本,因此f
有自己的字符串版本,在isHidden
更改时不会更新。
要使f
跟踪 isHidden
的值,请向其返回引用:
string& getHiddenStatus() { return isHidden; }
^
和
string& f = yayOrNay.getHiddenStatus();
^
如果不应通过引用更改isHidden
,请将其设为const
引用:
const string& getHiddenStatus() const { return isHidden; }
和
const string& f = yayOrNay.getHiddenStatus();
现在尝试通过isHidden
更改f
会导致编译错误:
f = "bwahaha";
(const
和getHiddenStatus()
之间的{
使函数本身const
。它告诉了
编译器和代码的读者
getHiddenStatus
不会修改HideAndSeek
,
这样你就可以在const HideAndSeek
对象上调用它。)
答案 1 :(得分:3)
调用setHiddenStatus()不会更改f的值。
f被赋予了getHiddenStatus()的返回值,除非你给它一个新的值,否则不会改变。