Declarando variables en un switch

Publicado el 25 diciembre 2013 por Dracux @isladelmono

Lo bueno de programar es que uno va aprendiendo cosas de manera constante. Resulta que tenía un código en el que de acuerdo a ciertos valores, estructurados en un switch, debía hacer diversas cosas. Una de ellas debía crear un objeto de una clase dado que había creado.  Básicamente el código era algo así:

 case 97:
            char nom[50];
            int valor;
            dado dadoCaracteristicas(6);
            codigoComando=1;
            clear();
            mvprintw(5,1,"%s","Ingrese nombre: ");
            getstr(nom);
            perso.setNombre(nom);
            mvprintw(6,1,"%s","Ingrese raza [1-Humano/2-Elfo]: ");
            scanw("%d",&valor);
            perso.setRaza(valor);
            break;

El problema que se daba con esto es que me daba un par de errores:

C:\programacion\BladeOfDestiny\principal.cpp||In member function ‘void principal::loopPrincipal()’:|
C:\programacion\BladeOfDestiny\principal.cpp|48|error: jump to case label [-fpermissive]|
C:\programacion\BladeOfDestiny\principal.cpp|37|error: crosses initialization of ‘dado dadoCaracteristicas’|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|

Al principio pensé que tenía que ver con mi clase dado, pero no encontré el problema por lo que entendí que el asunto tenia que venir por otro lado. En este post explican que es lo que pasa. La idea es que si declaro algo dentro de un switch tengo que usar llaves, por lo que el código final debería ser algo así:

case 97:{
            char nom[50];
            int valor;
            dado dadoCaracteristicas(6);
            codigoComando=1;
            clear();
            mvprintw(5,1,"%s","Ingrese nombre: ");
            getstr(nom);
            perso.setNombre(nom);
            mvprintw(6,1,"%s","Ingrese raza [1-Humano/2-Elfo]: ");
            scanw("%d",&valor);
            perso.setRaza(valor);
            break;
        }

Y obviamente ahora si compila.

El asunto es el siguiente: La vida de las variables se delimita entre las llaves, al no ponerlas, la variable creada (en este caso el objeto) seguiría vivo tras el break.

Cosas que pasan a medida que uno programa…

P.D.: Esto es parte del código del Roguelike así que supongo que pronto lo verán.