Case mit {}
-
Hallo,
vorweg muss ich sagen das ich C++ beginner bin und gerade in die OOP einsteige.
Jetzt habe ich mir ein kleines Beispiel herangezogen und habe dies versucht umzusetzen. Mir gelang das auch ganz gut bis auf dieden Fehler:Case umgeht die Initialisierung einer lokalen Variable
Das Problem habe ich gelöst, jedoch habe ich dazu eine Frage. Warum tritt der Fehler nicht mehr auf wenn ich case 1: {} setze. Das heisstz mit den {} bekomme ich den Fehler nicht.
Könnte mir jemand erklären warum das so ist?
Danke schonmal im Vorraus!
Hier der Code:
#include <iostream.h> #include <conio.h> //Klassendefinition class Konto { private: int Kontostand; public: int getKontostand(); int setKontostand(int); int setKontostandEinz(int); int setKontostandAusz(int); }; //Definition der Methoden int Konto::setKontostand(int neuerStand) { Kontostand = neuerStand; return Kontostand; } int Konto::getKontostand() { return Kontostand; } int Konto::setKontostandEinz(int einzahlung) { Kontostand += einzahlung; return Kontostand; } int Konto::setKontostandAusz(int auszahlung) { Kontostand -= auszahlung; return Kontostand; } void main() { //Deklaration des Objekts Konto testKonto; int eingabe = 0; int flag = 1; testKonto.setKontostand(0); while(flag == 1) { cout<<"\n\nK O N T O V E R W L T U N G"<<endl; cout<<"1 = Kontostand ausgeben"<<endl; cout<<"2 = Kontostand aendern"<<endl; cout<<"3 = Ende der Aktion\n\n"<<endl; cin>>eingabe; switch(eingabe) { case 1: { cout<<"Der Kontostand betraegt: "<<testKonto.getKontostand()<<"\n\n"<<endl; break; } case 2: { int einzAusz = 0; cout<<"Moechten Sie abheben oder einzahlen? "<<endl; cout<<"1 = einzahlen "<<endl; cout<<"2 = auszahlen "<<endl; cout<<"3 = setzen "<<endl; cin>>einzAusz; if(einzAusz == 1) { int einzahlungNeu; cout<<"Wie viel wollen Sie einbezahlen? "; cin>>einzahlungNeu; testKonto.setKontostandEinz(einzahlungNeu); } else if(einzAusz == 2) { int auszahlenNeu; cout<<"Wie viel wollen Sie abheben? "; cin>>auszahlenNeu; testKonto.setKontostandAusz(auszahlenNeu); } else if(einzAusz == 3) { int setzeNeuenStand; cout<<"Welchen Betrag soll der neue Kontostand haben? "; cin>>setzeNeuenStand; testKonto.setKontostand(setzeNeuenStand); } break; } case 3: { flag = 0; cout<<"Programm beendet"<<endl; break; } } } getch(); }
-
bei switch-case springt das Programm direkt zur "richtigen" case-Marke. Wenn in dem Bereich dazwischen Variablen definiert werden, sind die an der Stelle theoretisch gültig, aber nicht initialisiert (weil die Initialisierung nicht innerhalb der case-Marke lag, wird sie NICHT ausgeführt), enthalten also undefinierte Werte.
Wenn du den Inhalt einer case-Marke in einen eigenen Block {} setzt, werden die darin definierten Variablen auf diesen Block beschränkt und sind außerhalb nicht mehr verfügbar:switch(var1) { case 1: int i=7; cout<<"2*"<<i<<"="<<2*i<<endl; break; case 2://überspringt die "int i=7;" -> Wert undefiniert cout<<"i="<<i<<endl; break; } switch(var2) { case 1: { int i=7; cout<<"2*"<<i<<"="<<2*i<<endl; break; } case 2: //i ist ungültig, kann also nicht mit undefiniertem Wert verwendet werden }
-
Das heisst man sollte am besten entweder die Variablen auserhalb definieren oder eben immer die Klammern hinzufügen oder?
Gruss Michael
-
je nach dem, was du willst. wenn du sie außerhalb definierst sind sie überall in dieser funktion gültig. wenn du sie in {} definierst kannst du auch nur in dem bereich in klammern benützen.
geloescht
-
Das heisst, wenn ich keine {} verwende (auch bei IF etc.) sind die definierten Variablen im zuvor aktuellen Block aktiv?
Dann gewöhn ich mir wohl immer an das ich die {} hin mache.Gruss Michael
-
Nun ja... vielleicht verdeutlicht etwas pseudocode die situation:
int x; //globale variable void foo() { int a; //a und x hier ansprechbar switch(a) { case 1: //a und x hier ansprechbar //int b ginge hier nicht! sonst wäre die variable manchmal definiert und manchmal nicht, je nach dem, ob int == 1 break; case 2: { int b; //a, x und b hier ansprechbar } break; case 3: //nur a und x hier ansprechbar break; } }Eine Variable ist gültig, wenn sie im selben oder einem übergeordneten Block definiert wurde. Dabei ist es egal, ob man in einem Unterblock oder Unterunterblock ist. Blöcke werden immer durch {} begrenzt.
geloescht