Datei i/o fstream, Fehler bei Variablen initialisierung
-
Ich hab ein Kleines Programm geschrieben das im groben aus 2 Klassen ebsteht die eine Klasse ist zur Speicherung mehrerer Variablen zuständig (Element) und die andere Verwaltet ein Array das Werte des Typs Element ausfnehmen kann (Datenbank).
Hier mein eigentliches Programm:
void main() { cout<<"1 für einlesen, 2 für schreiben"<<endl; int eingabe; cin>>eingabe; switch(eingabe) { case 1: ifstream in("ausgabe.txt"); int size; string line; break; case 2: Datenbank data(10); data.eintragen("a1","a1v"); data.eintragen("a2","a2v"); data.eintragen("a3","a3v"); ofstream out("ausgabe.txt"); out<<data.getSize()<<endl; for(int i=0;i<data.getSize();++i) { out<<data[i].getKey()<<endl; out<<data[i].getValue()<<endl; }; break; }; };case 2 Funktioniert Tadellos und erstellt eine Datenbank die danach zeilenweise in eine Datei ausgegeben wird.
case 1 jedoch funktioniert nicht.
Ich bekomme beim Compilen folgende Fehlermldung, für in und für line
error C2360: initialization of 'line' is skipped by 'case' label
see declaration of 'line'
Kann mir aber nicht erklären was die Meldung soll da die Variablen ja eigentlich ordnungsgemäß angegeben sind.
Ich hoffe mir kann da jemand weiterhelfen.
-
Das kannst du umgehen in dem du einen Block {} um die Funktionen in case 1 und 2 machst, ob das so schön ist weiss ich ned (sry wieder mal halbwissen, ich weiss)
-
THX 1138 schrieb:
Das kannst du umgehen in dem du einen Block {} um die Funktionen in case 1 und 2 machst, ob das so schön ist weiss ich ned (sry wieder mal halbwissen, ich weiss)
Ok das funktioniert, danke. Aber wie kommt so ein Fehler zu stande? und vor allem warum nicht beim int?
-
Der Fehler kommt dadurch zustande, daß die case-Marken keinen eigenen Scope definieren. Das bedeutet, daß die Variablen size und line auch im 'case 2:' Abschnitt gültig sind. Allerdings werden beide Variablen nur initialisiert, wenn das Programm ihre Definition "besucht" - für int-Werte ist das unkritisch, weil die keine Konstruktoren haben, aber der std::string hat einen Ctor, der durch das 'case 2:' übersprungen wird (das heißt bei der Eingabe '2' hätte das Programm eine nicht-initialisierte Stringvariable - wenn du die verwenden würdest, käme es zum Crash).