2015-07-15 3 views
1

Я занимаюсь C++ OOP, и я ожидал, что переменная private внутри класса будет обновлена ​​после установки ее публичной функцией, но ничего не произошло. Вот код.Почему переменная не обновляется

#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 выходы "N" в обоих случаях, даже если его значение должно быть изменено на "Y" с

yayOrNay.setHiddenStatus("Y"); 

Кроме того, я обнаружил, что вызов

yayOrNay.getHiddenStatus() 

к переменной f снова

f = yayOrNay.getHiddenStatus(); 

дает правильный вывод, но я думаю, что это слишком много шагов для обновления значения переменной. Может кто-нибудь, пожалуйста, укажите мою ошибку?

+1

Что такое 'int a = 5; int b = a; a = 6; cout << b; 'print? – immibis

+0

immibis b будет == 5 – FlashspeedIfe

+1

Причина b равна 5 по той же причине, что и здесь «N». – immibis

ответ

3

Вызывать setHiddenStatus() не изменяет значение ф.

f было присвоено возвращаемое значение getHiddenStatus() и не изменится, если вы не дадите ему новое значение.

5

getHiddenStatus возвращает копию так f имеет свою собственную версию строки, которая не будет обновляться, когда isHidden изменяется.

Чтобы fтрека Значение isHidden, возвращает ссылки к нему:

string& getHiddenStatus() { return isHidden; } 
    ^

и

string& f = yayOrNay.getHiddenStatus(); 
    ^

Если isHidden не должен быть изменен с помощью ссылки, сделать его a const ссылка:

const string& getHiddenStatus() const { return isHidden; } 

и

const string& f = yayOrNay.getHiddenStatus(); 

Теперь пытается изменить isHidden через f приводит к ошибке компиляции:

f = "bwahaha"; 

(const между getHiddenStatus() и { делает саму const функцию. Это говорит компилятор и читателей кода, getHiddenStatus не изменяет HideAndSeek, , так что вы можете вызвать его на const HideAndSeek объекта).

Смежные вопросы