Membayangkan Pembolehubah dalam C
Dalam pengaturcaraan berorientasikan objek, membayangi berlaku apabila pembolehubah yang ditakrifkan dalam kelas mempunyai nama yang sama dengan pembolehubah dalam skop luar. Ini boleh membawa kepada gelagat yang tidak dijangka, kerana pembolehubah dalaman lebih diutamakan berbanding pembolehubah luar.
Masalah: Membayangi dalam Kelas
Pertimbangkan definisi kelas berikut:
<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>
Kaedah get dalam kelas ini bertujuan untuk membaca nilai daripada fail dan menyimpannya dalam tatasusunan measure_set, dan untuk membaca nilai suhu dan menyimpannya dalam pembolehubah T.
Walau bagaimanapun , apabila anda melaksanakan kaedah get seperti berikut:
<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>
Anda perasan bahawa nilai suhu (T) sedang disimpan dalam elemen pertama tatasusunan measure_set (measure_set[0]) dan bukannya T yang dimaksudkan pembolehubah.
Penyelesaian
Ini berlaku kerana C membenarkan pembolehubah dengan nama yang sama diisytiharkan dalam skop yang berbeza. Dalam kes ini, pembolehubah T yang diisytiharkan dalam kaedah get membayangi pembolehubah ahli kelas T.
Untuk mengelakkan pembayangan, anda boleh sama ada menggunakan nama yang berbeza untuk pembolehubah atau menggunakan operator resolusi skop (::) untuk secara eksplisit rujuk kepada pembolehubah ahli kelas.
Menggunakan nama yang berbeza untuk pembolehubah suhu dalam kaedah get akan kelihatan seperti ini:
<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>
Menggunakan pengendali resolusi skop untuk merujuk kelas secara eksplisit pembolehubah ahli akan kelihatan seperti ini:
<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>
Atas ialah kandungan terperinci ## Mengapakah nilai suhu saya disimpan dalam tatasusunan dan bukannya pembolehubah yang dimaksudkan dalam kelas C saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!