2010-12-09 12 views
7

mi código tiene 3 clases n_hexa, n_octa, n_bin. El código está aquípor qué no puedo crear una instancia de objetos dentro de un bloque de interruptor

switch(choice) 
{ 
case 1: cin>>n; 
n_hexa nx(n); 
     break; 
case 2: cin>>n; 
n_octa no(n); 
     break; 
case 3: cin>>n; 
n_bin nb(n); 
     break; 
} 

sobre la compilación da un mensaje "cruza la inicialización de n_hexa" para la línea de n_octa

+0

bienvenida a desbordamiento de pila ... por favor utilice el botón de formato "código" en la barra de herramientas (que tiene este aspecto: 101010") para dar formato al código en el futuro –

+0

relacionados.: http://stackoverflow.com/questions/2351936/create-an-object-in-switch-case http://stackoverflow.com/questions/449736/why-cant-variables-be-declared-in-a-switch -statement http://stackoverflow.com/questions/1231198/declaring-variables-inside-a-switch-statement http://stackoverflow.com/questions/2036819/compile-error-with-switch-expected-expression-before http://stackoverflow.com/questions/1115304/can-i-declare-variables-inside-an-objective-c-switch-statement http: // stackoverflow.com/questions/4068909/odd-compiler-error-when-using-obj-c-objects-in-a-switch-statement –

Respuesta

10

Si usted quiere tener objetos temporales dentro de una caja, que tendrá que alcance ellos apropiadamente.

switch(choice) 
{ 
    case 1: 
    { 
     cin>>n; 
     n_hexa nx(n); 
     break; 
    } 
    case 2: 
    { 
     cin>>n; 
     n_octa no(n); 
     break; 
    } 
    case 3: 
    { 
     cin>>n; 
     n_bin nb(n); 
     break; 
    } 
} 
+0

wat ¿Quiere decir por alcance correctamente – lovesh

+0

@ user535962: introduzca un nuevo alcance para cada 'caso 'al encerrar el código entre llaves, como lo hizo EboMike aquí. –

+0

Ver mi código. El problema es que podría haber un desplome si estás omitiendo el descanso, por lo que terminarías en el siguiente caso. ¿Cuál es la duración del objeto? Si le pones explícitamente llaves alrededor, queda claro cuándo se creará el objeto y cuándo se destruirá. – EboMike

2

Trate declarar las variables anteriores la orden de conmutación: Poste

n_hexa nx; 
n_octa no; 
n_bin nb; 
switch(choice) { 
    case 1: 
     cin>>n; 
     nx(n); 
     break; 
... 
+0

Eso también funciona, aunque sería un desperdicio si esas clases tienen costosos constructores/destructores, o si son grandes. Sí, vi tu comentario en mi respuesta :) – EboMike

+0

@EboMike: a menos que el usuario535962 esté específicamente después de algún efecto secundario de la construcción, o presente algunas afirmaciones adicionales antes del descanso, este enfoque es aún más útil que los temporales que desaparecen. Hace que desee ver el contexto de contexto; probablemente haya una forma mejor de escribir la misma funcionalidad, pero no está claro qué. –

+0

@Tony: Supongo que nadie sabe cuál es la intención :) La ventaja de poner las variables en los casos es que el código es más contenido, pero realmente depende de lo que se supone que debe hacer el código. Si los objetos se usan fuera del interruptor, entonces el enfoque del Mago es obviamente el único camino a seguir. – EboMike

2

de Ebomike tiene la respuesta para deshacerse de los errores. Ahora, la razón es,

a partir de documentos estándar 6.7.3,

Es posible transferir en un bloque, aunque no de una manera que no pasa por las declaraciones de inicialización. Un programa que salta 77) desde un punto donde una variable local con duración de almacenamiento automático no está en alcance hasta un punto donde está en el alcance está mal formado a menos que la variable tenga tipo trivial (3.9) y se declare sin inicializador (8.5).

Un ejemplo de la propia documentación estándar,

void f() 
{ 
// ... 
goto lx; // ill-formed: jump into scope of a 
// ... 
ly: 
X a = 1; 
// ... 
lx: 
goto ly; // OK, jump implies destructor 
// call for a followed by construction 
// again immediately following label ly 
} 

en que se forma mal la declaración goto lx; porque está siendo saltó a la declaración lx, donde el alcance de a es visible.

También,

77) La transferencia de la condición de una sentencia switch para una etiqueta caso se considera un salto en este respecto.

Por lo tanto, esto también se aplica a switch.

Y si se colocan llaves {}, el alcance está limitado a las llaves y usted es libre de declarar dentro de cada declaración case.

Espero que ayude ..

Cuestiones relacionadas