Heim >Backend-Entwicklung >C++ >## Warum wird mein Temperaturwert im Array gespeichert und nicht in der vorgesehenen Variablen in meiner C-Klasse?

## Warum wird mein Temperaturwert im Array gespeichert und nicht in der vorgesehenen Variablen in meiner C-Klasse?

Barbara Streisand
Barbara StreisandOriginal
2024-10-25 00:27:301067Durchsuche

## Why is my temperature value being stored in the array instead of the intended variable in my C   class?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn