2014-03-31 77 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(); 
} 

(主叫coating->Prepare(currentID)當具體currentID參數)。

據我可以告訴currentID在if語句中聲明。

在MS VS2012上運行這個,錯誤代碼是C2065。

+0

'currentID'只存在於聲明的範圍中。 – juanchopanza

+0

與if語句中的一樣嗎? – user3001499

+0

除了@juanchopanza說的什麼,在哪裏聲明瞭'select'?我假設它是一個會員/全球? – nonsensickle

回答

3

currentID只存在於if和else之外,它沒有聲明之外,你可以在IF之前聲明它並在IF和Else中初始化。

同樣作爲評論如果選擇它不是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

why = NULL,是不是= new IDcard(); ?? – user3001499

+1

@ user3001499這意味着'IDcard()'是*可構造*,我們不知道。同樣,標準的做法是將指針初始化爲空,儘管通常你不會使用NULL而是0(即'IDcard * currentID = 0'是更好的選擇)。 – nonsensickle