2013-02-03 50 views
47

跳過我不明白爲什麼我收到的錯誤:初始化「元素」是由「案例」標籤

initialization of 'element' is skipped by 'case' label.

可有人請向我解釋?

void LinkedList::process_example(int choice) { 
    switch(choice) { 
    case 1: 
     cout << endl << endl << "Current S = "; 
     this->printSet(); 

     cout << "Enter an element :"; 
     char* element = "lol"; 

     //cin>>element; 
     cin.clear(); 
     cin.ignore(200, '\n'); 

     this->Addelementfromback(element); //error is here 
     cout << endl << endl << "Current S = "; 

     this->printSet(); 
     break; 

    case 2: 
     this->check_element(); 
     break; 

    case 3: 
     cout << endl << endl; 
     cout << "Current Set S = "; 
     this->printSet(); 

     cout << endl << "S has "; 
     int count = this ->check_cardinality(); 
     cout << count << " elements"; 
     break; 
    } 
} 
+0

這個錯誤很明顯,也很奇怪的使用switch語句。 – Rapptz

+6

每個'case'不會引入一個新的範圍(只有'{}'塊會這樣做)。所以當你在一個case中聲明一個變量時,它應該放在它自己的塊中。 – Cameron

回答

101

嘗試包裹case{},並把所有的語句中{}

case 1: 
{ 
    cout << endl << endl << "Current S = "; 
    this->printSet();  
    // and other mess 
} 
break; 

您應該將所有這些語句放在函數中,並保留case語句清晰。例如,寫這篇文章的風格:

case 1: 
    initializeElement(); 
    break; 
case 2: 
    doSomethingElse(); 
    break; 

link

+6

@billiz爲什麼把{}解決問題? – Computernerd

+11

作用域問題,'case:'直到'break'不會引入新的作用域,所以你必須使用'{}' – billz

+2

我還是不太明白,我可以閱讀的任何文章以便更好地理解? – Computernerd

0

當一個變量在一個case聲明,接下來case在技術上仍處於相同的範圍內,所以你可以參考它存在,但如果你打的如果不打這個,你最終會調用一個未初始化的變量。這個錯誤阻止了。

您只需在switch聲明前定義它,或使用大括號{ }確定它在退出特定case之前超出範圍。