2014-03-31 3 views
0

이 오류가 왜 신고되지 않은 식별자입니까?컴파일러가 왜 위의 "if"문에서 선언 한 변수에 대해 "선언되지 않은 식별자"라고 말합니까?

void IDcard::Prepare(CoatingDecorator *coating) 
{ 
    if (select == 1) { IDcard *currentID = new Passport(); } 
    else if (select == 2) { IDcard *currentID = new DriversLicence(); } 

    AddPhoto(); 
    coating->Prepare(currentID); 
    std::cout << "Total Cost: " << coating->totalCost; 
    DispenseID(); 
} 

(구체적 currentID 파라미터 coating->Prepare(currentID) 호출).

현재까지는 if 문에서 currentID를 선언 할 수 있습니다.

MS VS2012에서이 코드를 실행하면 오류 코드는 C2065입니다.

+0

'currentID'는 if 문의 내에서와 같이 – juanchopanza

+0

으로 선언 된 범위에만 존재합니까? – user3001499

+0

@juanchopanza가 말한 것에 덧붙여,'select'는 어디에 선언 되었습니까? 나는 그것이 회원/글로벌이라고 가정하고 있습니까? – nonsensickle

답변

3

현재 ID는 if 및 else에 있으며 선언되지 않은 경우 IF 앞에 선언하고 IF 및 기타로 초기화 할 수 있습니다.

또한 1 또는 2가 아닌 것을 선택하면 초기화되지 않으므로 문제가 발생할 수 있으므로 초기화해야합니다.

void IDcard::Prepare(CoatingDecorator *coating) 
{ 
IDcard *currentID; 

if (select == 1) { currentID = new Passport(); } 
else if (select == 2) { currentID = new DriversLicence(); } 

AddPhoto(); 
coating->Prepare(currentID); 
std::cout << "Total Cost: " << coating->totalCost; 
DispenseID(); 
} 
+0

코드를 그대로두면 'currentID'가 초기화되지 않은 채로 남아있을 수 있다고 설명 할 수 있습니까? 그 후에는 +1이됩니다. – nonsensickle

+0

끝내 주셔서 감사합니다. @ LuisTellez, 저의 어리석은 실수입니다.하지만 아마 저에게 시간을 절약 해 주셨을 것입니다. – user3001499

+1

@LuisTellez가 업데이트 된 답변을 주셔서 감사합니다. 매우 유익하고 내 문제를 해결합니다. – user3001499

0

오류를 수정하려면 if 블록 외부에서 currentID를 선언 할 수 있습니다.

void IDcard::Prepare(CoatingDecorator *coating) 
{ 
    IDcard *currentID = NULL; 
    if (select == 1) { currentID = new Passport(); } 
    else if (select == 2) { currentID = new DriversLicence(); } 

    AddPhoto(); 
    coating->Prepare(currentID); 
+0

@LuisTellez가 빠르지 만 정확합니다. +1. – nonsensickle

+0

왜 = NULL이 아니겠습니까 = 새로운 IDcard(); ?? – user3001499

+1

@ user3001499 즉,'IDcard()'는 우리가 알지 못하는 * constructable *을 의미합니다. 마찬가지로 일반적으로 널이지만 0은 사용하지 않지만 (예 : 'IDcard * currentID = 0'이 더 나은 선택이지만) null에 대한 포인터를 초기화하는 것이 일반적입니다. – nonsensickle