为什么不变量更新

Fla*_*Ife 1 c++ oop variables

我正在练习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"

}
Run Code Online (Sandbox Code Playgroud)

字符串变量f在两种情况下都输出"N",即使它的值应该已经改为"Y"

yayOrNay.setHiddenStatus("Y");
Run Code Online (Sandbox Code Playgroud)

我也发现了打电话

yayOrNay.getHiddenStatus() 
Run Code Online (Sandbox Code Playgroud)

再次变量f

f = yayOrNay.getHiddenStatus();
Run Code Online (Sandbox Code Playgroud)

产生适当的输出,但我认为更新变量值的步骤太多了.任何人都可以请帮助指出我的错误?

eml*_*lai 5

getHiddenStatus返回一个副本,因此f有自己的字符串版本,isHidden更改时不会更新.

f 跟踪其值isHidden,请返回对它的引用:

string& getHiddenStatus() { return isHidden; }
      ^
Run Code Online (Sandbox Code Playgroud)

string& f = yayOrNay.getHiddenStatus(); 
      ^
Run Code Online (Sandbox Code Playgroud)

如果isHidden不应通过参考更改,请将其作为const参考:

const string& getHiddenStatus() const { return isHidden; }
Run Code Online (Sandbox Code Playgroud)

const string& f = yayOrNay.getHiddenStatus(); 
Run Code Online (Sandbox Code Playgroud)

现在尝试更改isHidden通过f导致编译错误:

f = "bwahaha";
Run Code Online (Sandbox Code Playgroud)

(本const之间getHiddenStatus(){使得本身的功能const,它告诉编译器和代码的读者 getHiddenStatus不会修改HideAndSeek,这样就可以把它叫做上const HideAndSeek的对象.)