Shadowing-Variablen in C
Bei der objektorientierten Programmierung tritt Shadowing auf, wenn eine innerhalb einer Klasse definierte Variable denselben Namen wie eine Variable hat in einem äußeren Bereich. Dies kann zu unerwartetem Verhalten führen, da die innere Variable Vorrang vor der äußeren Variablen hat.
Problem: Shadowing in einer Klasse
Bedenken Sie die folgende Klassendefinition:
<code class="cpp">class Measure { int N; double measure_set[]; char nomefile[]; double T; public: void get( ); void printall( ); double mean( ); double thermal_comp( ); };</code>
Die get-Methode in dieser Klasse ist dafür gedacht, Werte aus einer Datei zu lesen und sie im Array Measure_set zu speichern, und einen Temperaturwert zu lesen und ihn in der T-Variablen zu speichern.
Allerdings , wenn Sie die get-Methode wie folgt implementieren:
<code class="cpp">void Measure::get() { cout << "Insert filename:" << endl; cin >> nomefile; cout << endl; cout << nomefile << endl; cout << endl; int M = 0; int nmax = 50; ifstream f; f.open(nomefile); while (M < nmax) { f >> measure_set[M]; if (f.eof()) break; M++; } f.close(); N = M + 1; cout << "Insert temperature:" << endl; cin >> T; cout << endl; }</code>
Sie haben bemerkt, dass der Temperaturwert (T) im ersten Element des Measure_set-Arrays (measure_set[0]) anstelle des beabsichtigten T gespeichert wird Variable.
Lösung
Dies tritt auf, weil C die Deklaration von Variablen mit demselben Namen in unterschiedlichen Bereichen zulässt. In diesem Fall schattiert die in der get-Methode deklarierte T-Variable die Klassenmitgliedsvariable T.
Um Schattenbildung zu vermeiden, können Sie entweder unterschiedliche Namen für die Variablen verwenden oder den Bereichsauflösungsoperator (::) explizit verwenden Verweisen Sie auf die Klassenmitgliedsvariable.
Die Verwendung eines anderen Namens für die Temperaturvariable in der get-Methode würde wie folgt aussehen:
<code class="cpp">void Measure::get() { cout << "Insert filename:" << endl; cin >> nomefile; cout << endl; cout << nomefile << endl; cout << endl; int M = 0; int nmax = 50; ifstream f; f.open(nomefile); while (M < nmax) { f >> measure_set[M]; if (f.eof()) break; M++; } f.close(); N = M + 1; cout << "Insert temperature:" << endl; double temperature; // Use a different name for the temperature variable cin >> temperature; T = temperature; cout << endl; }</code>
Verwendung des Bereichsauflösungsoperators, um explizit auf die Klasse zu verweisen Mitgliedsvariable würde so aussehen:
<code class="cpp">void Measure::get() { cout << "Insert filename:" << endl; cin >> nomefile; cout << endl; cout << nomefile << endl; cout << endl; int M = 0; int nmax = 50; ifstream f; f.open(nomefile); while (M < nmax) { f >> measure_set[M]; if (f.eof()) break; M++; } f.close(); N = M + 1; cout << "Insert temperature:" << endl; cin >> this->T; // Use the scope resolution operator to refer to the class member variable cout << endl; }</code>
Das obige ist der detaillierte Inhalt von## Warum wird mein Temperaturwert im Array gespeichert und nicht in der vorgesehenen Variablen in meiner C-Klasse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!