2016-08-18 5 views
0

Ich bin ein neuer C++ Programmierer und habe schon einige Java gelernt. Ich mache meinen Auftrag. Und ich konnte einfach nichts von diesem Problem hören.Objektwert kann nicht geändert werden

class A{ 
private: 
bool test; 

public: 
void anotherSetTest(); 
    void setTest(); 
A(); 
}; 
void Globle_scope_function(A a){ 
    a.setTest(true); 
} 

A::A(){ 
    test = false; 
} 
void A::setTest(bool foo){ 
     test = foo; 
} 
void A::anotherSetTest(){ 
    Globle_scope_function(*this); 
} 
int main(){ 
    A a; 
    a.anotherSetTest(); 
    cout<<a.getTest()<<endl;//It suppose to output true, but why does it output false. 
     system("pause"); 
     return 0; 
} 

Wenn ich Visual Studio zum Debuggen verwende, sagt es mir, dass das Objekt den Gültigkeitsbereich verlassen hat. Wie löse ich es ...: - <. Bearbeiten Sie es in MWV.

+2

Wenn Sie den Wert von der Aufruf-Site ändern möchten, müssen Sie als Referenz übergeben werden. – NathanOliver

+0

@Peter Chen Zeigen Sie ein minimales nachprüfbares Beispiel. –

+1

** Anders als in Java, in C++ - Objektnamen sind keine Referenzen unter der Haube. Sie übergeben eine Kopie des Objekts an 'Globle_scoop_function (A a)' (und wahrscheinlich an 'setTest'). Sie müssen sich über [C++ Referenzen] (https://en.wikipedia.org/wiki/Reference_ (C% 2B% 2B)) informieren und sie verwenden – mvidelgauz

Antwort

1

Globle_scoop_function(*this); Aufruf nimmt eine tiefe Kopie von *this zu den Funktionsparameter a. Es ist , dass Objekt, das am Ende von Globle_scoop_function außerhalb des Geltungsbereichs geht. Das Objekt *this bleibt unverändert.

Eine Abhilfe wäre, den Prototyp zu void Globle_scoop_function(A& a){ zu ändern. Man beachte die &, die eine Referenz bezeichnet. Sie ändern dann die a in main()durch diese Referenz. Die Tatsache, dass alle verschiedenen Instanzen von A in Ihrem Code alle a genannt werden, trägt nur zur Verwirrung bei.

+0

Warum haben Sie sich entschieden, dass VC++ sich darüber aufregt? –

Verwandte Themen