Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Mengapakah nilai suhu saya disimpan dalam tatasusunan dan bukannya pembolehubah yang dimaksudkan dalam kelas C saya?

## Mengapakah nilai suhu saya disimpan dalam tatasusunan dan bukannya pembolehubah yang dimaksudkan dalam kelas C saya?

Barbara Streisand
Barbara Streisandasal
2024-10-25 00:27:301032semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn