Ombrage des variables en C
En programmation orientée objet, l'observation se produit lorsqu'une variable définie dans une classe porte le même nom qu'une variable dans un périmètre extérieur. Cela peut conduire à un comportement inattendu, car la variable interne a priorité sur la variable externe.
Problème : observation dans une classe
Considérez la définition de classe suivante :
<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>
La méthode get de cette classe est destinée à lire les valeurs d'un fichier et à les enregistrer dans le tableau Measure_set, ainsi qu'à lire une valeur de température et à la stocker dans la variable T.
Cependant , lorsque vous implémentez la méthode get comme suit :
<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>
Vous avez remarqué que la valeur de température (T) est stockée dans le premier élément du tableau Measure_set (measure_set[0]) au lieu du T prévu variable.
Solution
Cela se produit car C permet aux variables portant le même nom d'être déclarées dans des portées différentes. Dans ce cas, la variable T déclarée dans la méthode get masque la variable membre de la classe T.
Pour éviter l'observation, vous pouvez soit utiliser des noms différents pour les variables, soit utiliser l'opérateur de résolution de portée (::) pour explicitement faire référence à la variable membre de la classe.
L'utilisation d'un nom différent pour la variable de température dans la méthode get ressemblerait à ceci :
<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>
Utiliser l'opérateur de résolution de portée pour faire explicitement référence à la classe la variable membre ressemblerait à ceci :
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!