2013-02-03 20 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'は新しいスコープを導入しません(' {} 'ブロックだけがそれを行います)。だから、あるケースの中に変数を宣言するとき、その変数はそれ自身のブロックの中に置くべきです。 – Cameron

答えて

101

{}caseをラップし、{}内のすべてのあなたの文を入れて試してみてください。

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

あなたは、関数内のすべてのこれらのステートメントを置く明確なcase文を維持する必要があります。あなたがそこにそれを参照することができるように、次のcaseは技術的にはまだ同じ範囲内である

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

変数が1 caseに宣言されている場合link

+6

@ビルズなぜ{}を入れて問題を解決するのですか? – Computernerd

+11

スコープの問題、 'case:'は 'break'まで新しいスコープを導入しないので、' {} 'を使う必要があります。 – billz

+2

まだ理解していません。 – Computernerd

0

を参照してくださいしかし、あなたはそれをヒットした場合:たとえば、このスタイルを書きますcaseこれを打つことなく、最初に初期化されていない変数を呼び出すことになります。このエラーはそれを防ぎます。

switchステートメントの前に定義するか、中括弧{ }を使用して特定のcaseを終了する前に範囲外になることを確認するだけです。

関連する問題