为什么不进行变量更新

时间:2015-07-15 00:25:51

标签: 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"

}

字符串变量f输出&#34; N&#34;在这两种情况下,即使它的价值应该改为&#34; Y&#34;与

yayOrNay.setHiddenStatus("Y");

我也发现了打电话

yayOrNay.getHiddenStatus() 

再次变量f

f = yayOrNay.getHiddenStatus();

产生适当的输出,但我认为更新变量值的步骤太多了。有人可以帮忙指出我的错误吗?

2 个答案:

答案 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";

constgetHiddenStatus()之间的{使函数本身const。它告诉了                                           编译器和代码的读者                                           getHiddenStatus不会修改HideAndSeek,                                           这样你就可以在const HideAndSeek对象上调用它。)

答案 1 :(得分:3)

调用setHiddenStatus()不会更改f的值。

f被赋予了getHiddenStatus()的返回值,除非你给它一个新的值,否则不会改变。