2012-04-30 9 views
11

Duplicar posibles:
Why can't variables be declared in a switch statement?error C2361: inicialización de 'encontrado' se salta por 'defecto' etiqueta

Tengo un extraño error en mi código de abajo:

char choice=Getchar(); 
switch(choice) 
{ 
case 's': 
    cout<<" display tree "; 
    thetree->displaytree(); 
    break; 

case 'i': 
    cout<<" enter value to insert "<<endl; 
    cin>>value; 
    thetree->insert(value); 
    break; 
case 'f' : 
    cout<< "enter value to find "; 
    cin>>value; 
    int found=thetree->find(value); 
    if(found!=-1) 
     cout<<" found = "<<value<<endl; 
     else 
      cout<< " not found " <<value <<endl; 
     break; 
default: 
    cout <<" invalid entry "<<endl;; 
    } 

El compilador de Visual Studio 2010 dice que:

1>c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(317): error C2361: initialization of 'found' is skipped by 'default' label 
1>   c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(308) : see declaration of 'found' 

Creo que he escrito correctamente declaraciones de ruptura y predeterminadas, entonces, ¿dónde está el error?

+3

-1 para dar muchos códigos irrelevantes cuando el mensaje de error indica claramente dónde está el código problemático. –

+4

¿Cuándo desapareció el antiguo arte de leer los mensajes de error? – PlasmaHH

+6

Esto es solo un duplicado exacto si ya conoce la respuesta al problema. El críptico "error C2361: la inicialización de 'encontrado' se omite por 'etiqueta predeterminada'" no necesariamente lo lleva a la pregunta '¿Por qué no se pueden declarar variables en una declaración de conmutación?' –

Respuesta

43

Necesitas tener ya sea incluir su case 'f': con un corsé de ámbito:

case 'f' : 
{ 
    cout<< "enter value to find "; 
    cin>>value; 
    int found=thetree->find(value); 
    if(found!=-1) 
     cout<<" found = "<<value<<endl; 
    else 
     cout<< " not found " <<value <<endl; 
    break; 
} 

o colocar la declaración de found fuera de las switch

6

Debe declarar las variables internas de switch 's case dentro de las llaves. es decir

case 'f' : 
{ 
    ... 
    int found=thetree->find(value); 
    ... 
} 
+0

No es suficiente para decirme qué hacer. NECESITA también escribir una oración o dos sobre por qué. –

16

La semántica de un switch son los de una goto: case s no haga introduzca un nuevo alcance. Por lo tanto, found está disponible en su default: case (aunque en realidad no tiene acceso). Saltar sobre una inicialización no trivial es ilegal, por lo que su código se vuelve ilegal.

Dada la complejidad de su case 'f':, la mejor solución es probablemente para descomponerla en una función separada. De no ser así, puede poner todo el caso en {...}, creando un ámbito separado, o renunciar a la inicialización, escribiendo:.

int found; 
found = thetree->find(value); 

(Menciono esto para la integridad Es no la solución que lo haría recomendación.)

+5

Votación a favor para una explicación real. – Fulluphigh

+0

"' case's no introduce un nuevo alcance "- esta oración explica todo. –

Cuestiones relacionadas