2013-10-01 5 views
0

coutlettercase 콘솔에 대한 변수가 -858993460입니다. 다른 모든 것은 괜찮은 것 같습니다. 내가 여기서 무엇을 놓치고 있니? 여기이상한 int 값 얻기

을 주의 :

그래서 여기 내 코드의 샘플입니다

int main() 
{ 
    int lettercase = 0; 
    Switch switcher(lettercase); 
    lettercase = switcher.getLettercase(); 
    cout << "Lettercase: " << lettercase << endl; 

    return 0; 
} 

가 나는 또한 Switch라는 별도의 클래스가 있습니다. 다음은 헤더 파일의 샘플입니다 :

class Switch { 
public: 
    // DEFAULT CONSTRUCTOR 
    Switch(); 

    // OVERLOAD CONSTRUCTOR 
    Switch(int); 

    // DESTRUCTOR 
    ~Switch(); 

    // Lettercase accessor 
    int getLettercase(); 

private: 
    int lettercase; 
}; 

그리고 여기 내 정의의 예제입니다 :

// DEFAULT 
Switch::Switch() { 
    int lettercase = 0; 
} 

// OVERLOAD 
Switch::Switch(int lettercase) {  
    // CHANGE LETTER CASE 
    if (lettercase == 1) { 
     lettercase = 0; 
    } else { 
     lettercase = 1; 
    } 
} 

// DESTRUCTOR 
Switch::~Switch() { 
} 

// ACCESSOR 
int Switch::getLettercase() { 
    return lettercase; 
} 
+8

당신은 주석을 만 의견이 모든 사소한 것들, 그럼에도 당신은 클래스 멤버와 함수 매개 변수에 같은 이름 *을 부여 할 수 있습니다. C++에 대한 다윈 상 (Darwin award)의 필요성에 대해 이야기하십시오 ... –

+5

-858993460은 이상한 가치가 아닙니다. 16 진수로 변환하면 0xcccccccc입니다. 디버그 빌드에서 MSVC++을 사용할 때 디버거에서 다시 볼 때마다 "아, 초기화되지 않은 변수를 사용하고 있습니다!"라고 표시됩니다. 표준 버그. –

+0

@ Janisimo : 답변에서 언급 한 문제 외에도 비슷한 문제가 생성자에 존재합니다. 클래스 멤버가 초기화되지 않은 상태로있는 동안 생성자에서 로컬 변수를 초기화하고 있습니다. – AnT

답변

7
// OVERLOAD 
Switch::Switch(int lettercase) {  
    // CHANGE LETTER CASE 
    if (lettercase == 1) { 
     lettercase = 0; 
    } else { 
     lettercase = 1; 
    } 
} 

현재 범위의 문제가있다. 클래스 변수 lettercase을 변경하려고하지만 생성자의 인수가 lettercase이기도하므로 클래스 변수에 액세스하려면 this->lettercase을 사용해야합니다. 여기서 매개 변수의 이름을 변경하는 것이 좋습니다. 이 같은

뭔가 :

// OVERLOAD 
Switch::Switch(int initCase) {  
    // CHANGE LETTER CASE 
    if (initCase == 1) { 
     lettercase = 0; 
    } else { 
     lettercase = 1; 
    } 
} 

당신이 이상한 INT 당신의 범위 문제는 어느 클래스 변수 lettercase를 초기화에서 당신을 방지하기 때문에,하지만 게터는 여전히이 변수를 액세스하고 초기화되지 않은 반환 것을 얻고 있었다 이유 값.

편집 : 기본 생성자는 여기에 문제가 :

Switch::Switch() { 
    int lettercase = 0; 
} 

이 당신이 그것을하고 (또는 당신이 그것을 수행 할) 생각하는 일을하지 않습니다. 오히려 클래스 변수, lettercase를 초기화 않고, 새로운 변수 lettercase, (범위)를 생성하고 대신 0으로 초기화되고, 기본 생성자는 다음과 같아야합니다

Switch::Switch() { 
    lettercase = 0; 
} 
+2

비슷한 문제가 생성자에 존재합니다. 이 코드는 생성자에서 로컬 변수를 선언하고 초기화하는 반면 클래스 멤버는 초기화되지 않은 상태로 유지됩니다. – AnT

+2

@ AndreyT 편집 : 당신이 말하는 것을 봅니다. 그리고 지금 나는 그 문제를 다루기 위해 나의 대답을 편집했다. – nhgrif

+0

정말 고마워요. 나는 이것에 대해 실제로 조사해야한다. –