2010-12-09 6 views
7

mein Code hat 3 Klassen n_hexa, n_octa, n_bin. Der Code ist hierWarum kann ich Objekte in einem Switch-Case-Block instanziieren

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

zum Kompilieren es eine Nachricht gibt „Initialisierung von n_hexa kreuzt“ für die Linie von n_octa

+0

willkommen Überlauf zu stapeln ... bitte auf die „Code“ Formatierung Schaltfläche in der Symbolleiste verwenden (es sieht wie folgt aus: 101010") Code in der Zukunft zu formatieren –

+0

verwendet.: 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-wenn-benutze-obj-c-objekte-in-ein-switch-statement –

Antwort

10

Wenn Sie temporäre Objekte in einem Fall haben wollen, müssen Sie auf Umfang benötigen sie richtig.

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 du durch scope it richtig meinen – lovesh

+0

@ user535962: Führen Sie einen neuen Bereich für jeden Fall ein 'indem Sie den Code in geschweifte Klammern einfügen, wie es EboMike hier getan hat. –

+0

Siehe meinen Code. Das Problem ist, dass es zu einem Durchfall kommen kann, wenn Sie die Pause auslassen, damit Sie im nächsten Fall landen. Was ist die Lebensdauer des Objekts? Wenn Sie explizit geschweifte Klammern um ihn legen, ist es klar, wann das Objekt erstellt wird und wann es zerstört wird. – EboMike

2

Versuchen Sie, die Variablen über dem Schaltbefehl erklärt:

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

Das funktioniert auch, obwohl es etwas verschwenderisch wäre, wenn diese Klassen teure Konstruktoren/Destruktoren haben oder wenn sie groß sind. Ja, ich habe Ihren Kommentar zu meiner Antwort gesehen :) – EboMike

+0

@EboMike: Wenn der User535962 nicht speziell auf einige Nebeneffekte der Konstruktion zurückgreift oder einige zusätzliche Anweisungen vor der Pause setzt, ist dieser Ansatz immer noch nützlicher als Provisorien, die verschwinden. Sie möchten den umgebenden Kontext sehen - es gibt wahrscheinlich eine bessere Möglichkeit, die gleiche Funktionalität zu schreiben, aber es ist nicht klar, was. –

+0

@Tony: Ich denke, es ist jemand raten, was die Absicht ist :) Der Vorteil der Variablen in die Fälle ist, dass der Code mehr enthalten ist, aber es hängt wirklich davon ab, was der Code tun soll. Wenn die Objekte außerhalb des Schalters verwendet werden, ist der Ansatz des Assistenten offensichtlich der einzige Weg zu gehen. – EboMike

2

Ebomike der Post hat die Antwort der Fehler loszuwerden. Nun, der Grund ist,

Von Standard-docs 6.7.3,

Es ist möglich, in einen Block zu übertragen, aber nicht in einer Weise, die Erklärungen mit der Initialisierung umgeht. Ein Programm, das springt77) von einem Punkt, wo eine lokale Variable mit automatischer Speicherdauer nicht in einem Bereich ist, in Bereich ist schlecht gebildet, wenn die Variable Trivial-Typ (3.9) hat und ohne ein deklariert wird Initialisierer (8.5).

Ein Beispiel aus den Standard-Dokumenten selbst,

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 
} 

, in dem die Aussage goto lx; schlecht ausgebildet ist, weil es auf die Erklärung lx gesprungen wird, wo der Umfang der a sichtbar ist. Auch

,

77) Der Übergang von der Bedingung einer switch-Anweisung auf einen Fall Etikett wird ein Sprung in dieser Hinsicht betrachtet.

Das gilt also auch für switch.

Und wenn geschweifte Klammern {} in sie eingefügt werden, ist der Bereich auf die geschweifte Klammern beschränkt und Sie können innerhalb jeder case Erklärung deklarieren.

Hoffnung, das hilft ..

Verwandte Themen