>  기사  >  백엔드 개발  >  ## C 클래스에서 의도한 변수 대신 온도 값이 배열에 저장되는 이유는 무엇입니까?

## C 클래스에서 의도한 변수 대신 온도 값이 배열에 저장되는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-25 00:27:301034검색

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

C에서 변수 음영 처리

객체 지향 프로그래밍에서 클래스 내에 정의된 변수와 변수 이름이 같은 경우 음영이 발생합니다. 외부 범위에서. 내부 변수가 외부 변수보다 우선하므로 예기치 않은 동작이 발생할 수 있습니다.

문제: 클래스의 섀도잉

다음 클래스 정의를 고려하세요.

<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>

이 클래스의 get 메소드는 파일에서 값을 읽어 Measure_set 배열에 저장하고, 온도 값을 읽어서 T 변수에 저장하기 위한 것입니다.

그러나 , get 메소드를 다음과 같이 구현할 때:

<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>

온도 값(T)이 의도한 T 대신 Measure_set 배열(measure_set[0])의 첫 번째 요소에 저장되는 것을 확인했습니다. 변수.

해결 방법

이는 C에서 동일한 이름을 가진 변수를 다른 범위에서 선언하는 것을 허용하기 때문에 발생합니다. 이 경우 get 메소드에 선언된 T 변수는 클래스 멤버 변수 T를 섀도잉합니다.

섀도잉을 방지하려면 변수에 다른 이름을 사용하거나 범위 확인 연산자(::)를 사용하여 명시적으로 클래스 멤버 변수를 참조하세요.

get 메서드에서 온도 변수에 다른 이름을 사용하는 것은 다음과 같습니다.

<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>

범위 확인 연산자를 사용하여 클래스를 명시적으로 참조합니다. 멤버 변수는 다음과 같습니다:

<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>

위 내용은 ## C 클래스에서 의도한 변수 대신 온도 값이 배열에 저장되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.