2010-12-09 46 views
7

mon code a 3 classes n_hexa, n_octa, n_bin. Le code est icipourquoi je ne peux pas instancier des objets dans un bloc de commutateurs

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; 
} 

sur la compilation donne un message « traverse l'initialisation de n_hexa » pour la ligne de n_octa

+0

bienvenue à débordement de la pile ... s'il vous plaît utiliser la mise en forme « code » bouton de la barre d'outils (il ressemble à ceci: 101010") pour formater votre code à l'avenir –

+0

connexes.: 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/impair-compilateur-erreur-lors de l'utilisation-obj-c-objets-dans-une-switch-instruction –

Répondre

10

Si vous voulez avoir des objets temporaires à l'intérieur d'un cas, vous devrez portée les correctement.

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 signifie par champ correctement – lovesh

+0

@ user535962: Introduire une nouvelle portée pour chaque cas 'en enfermant le code entre accolades, comme EboMike l'a fait ici. –

+0

Voir mon code. Le problème est qu'il pourrait y avoir une erreur si vous omettez la pause, de sorte que vous finiriez dans le cas suivant. Quelle est la durée de vie de l'objet? Si vous mettez des accolades autour d'elle de manière explicite, il est clair quand l'objet sera créé et quand il sera détruit. – EboMike

2

Essayez de déclarer les variables ci-dessus la commande de commutateur: poste de

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

Cela fonctionne aussi, mais il serait un peu inutile si ces classes ont des constructeurs/destructeurs coûteux, ou s'ils sont gros. Oui, j'ai vu votre commentaire sur ma réponse :) – EboMike

+0

@EboMike: à moins que user535962 ne soit spécifiquement après un effet secondaire de construction, ou fasse des déclarations supplémentaires avant la pause, cette approche est encore plus utile que les temporaires qui disparaissent. Vous donne envie de voir le contexte environnant - il y a probablement une meilleure façon d'écrire la même fonctionnalité, mais on ne sait pas quoi. –

+0

@Tony: Je suppose que tout le monde en devine l'intention :) L'avantage de placer les variables dans les cas est que le code est plus confiné, mais cela dépend vraiment de ce que le code est censé faire. Si les objets sont utilisés à l'extérieur du commutateur, l'approche de l'assistant est évidemment la seule solution. – EboMike

2

EboMike a la réponse à se débarrasser des erreurs. Maintenant, la raison en est,

à partir des documents standard 6.7.3,

Il est possible de transférer dans un bloc, mais pas d'une manière qui contourne les déclarations d'initialisation. Un programme qui saute77) à partir d'un point où une variable locale avec une durée de stockage automatique n'est pas comprise dans un champ est mal formée sauf si la variable est de type trivial (3.9) et est déclarée sans initialiseur (8.5).

Un exemple de la documentation standard lui-même,

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 
} 

dans lequel la déclaration goto lx; est mal formé car il est sauté à la déclaration lx, où la portée de a est visible.

En outre,

77) Le transfert de l'état d'une instruction switch pour une étiquette de cas est considéré comme un saut à cet égard.

Cela s'applique également à switch.

Et si les accolades {} sont ajoutées, la portée est limitée aux accolades et vous êtes libre de déclarer dans chaque instruction case.

espoir qui aide ..