enum in einem struct
-
Hallo
kann ich das so verwenden:enum genre {Pop,Rock,Klassik,HardRock}; struct lied { string titel; string interpret; int erscheinungsjahr; double laenge; genre genre1; };
Weil wenn ich das so mach bekomm ich eine ellenlange fehlermeldung wenn ich z.b. in einer lied variable ein genre speichern will.
lied lied1; cin>>lied1.genre1;
error no match for operator >>
main.cpp:43:16: note: cannot convert 'lied1.lied::genre1' (type 'genre') to type 'signed char&'
main.cpp:43:16: note: cannot convert 'lied1.lied::genre1' (type 'genre') to type 'unsigned char&'
...
und noch viel mehr von dem Typ.weiß wer was da falsch ist? Einlesen von interpret, erscheinungsjahr etc. funktioniert ohne probleme.
mfg
-
enum in einem struct ist nicht das Problem. Problem ist das Einlesen in eine enum-Variable. Was stellst du dir denn vor, wie das funktionieren soll? Was soll dort eingegeben werden und was soll bei einer entsprechenden Eingabe passieren? Diese Fragen kannst nur du beantworten und daher gibt es dafür auch keine fertige Funktion, sondern du müsstest selber eine Lesefunktion für diesen enum-Typ definieren.
-
ich will das in lied1.genre1 nur "Pop", "Klassik", etc reingeschrieben werden darf. Verstehe nicht wieso das nicht funktioniert. Mit enum definier ich mir doch einfach nur einen typ, der halt nur die Werte Pop, Klassik etc. annehmen darf, genauso wie in ein int nur zahlen sollen. Und cin>>lied1.erscheinungsjahr funktioniert ja auch ohne probleme.
-
Die Namen Pop,Rock,Klassik,HardRock existieren nur im Quellcode, bzw zur Compilezeit.
"Pop", "Klassik" sind Stringliterale, die der Compiler nicht automatisch aus dem enum erzeugt.
Der weiß schlicht nicht, was er als Eingabe für deinen enum nehmen soll.
Daher kommt die Fehlermeldung.Du als Programmierer musst dafür sorgen, dass der String "Klassik" (oder "KLASSIK" oder "classic") dem enum Klassik entspricht.
-
Hier ein Beispiel, wie vom Eingabe-Stream in
genre
umgewandelt werden kann:#include <iostream> #include <istream> #include <string> enum genre {Pop,Rock,Klassik,HardRock}; struct lied { std::string titel; std::string interpret; int erscheinungsjahr; double laenge; genre genre1; }; std::istream& operator>>(std::istream& is, genre& value) { std::string s; if (std::getline(is, s)) { if (s == "Pop") { value = genre::Pop; } else if (s == "Rock") { value = genre::Rock; } else if (s == "Klassik") { value = genre::Klassik; } else if (s == "HardRock") { value = genre::HardRock; } else { is.setstate(std::ios_base::failbit); } } return is; } int main() { lied lied1; if (!(std::cin >> lied1.genre1)) { std::cout << "Es wurde kein gültiges Genre eingegeben!\n"; } }
Hinweis: Ich habe
std::
explizit hingeschrieben.
-
Hallo theta,
std::getline(is, s)
halte ich für ungünstig, da es ja eine ganze Zeile einliest.
Besser ist wohlis >> s;
damit auch z.B.
lied lied1; int n; std::cin >> lied1.genre1 >> n))
möglich ist, ohne daß explizit ein Zeilenumbruch vorliegen muß, sondern nur ein Whitespace.
-
Heavy Metal?
-
HeavyMetal
Hard Rock wurde ja auch als "HardRock" geschrieben...
-
Th69 schrieb:
... halte ich für ungünstig ...
Völlig einverstanden. Ich hoffe der Fragesteller hat das Prinzip trotzdem verstanden.
-
jo danke, ich habs dann so gemacht
if(s=="Pop") { lied1.genre1 = Pop; } else if(s=="Rock") { lied1.genre1 = Rock; } else if(s=="Klassik") { lied1.genre1 = Klassik; } else if(s=="HardRock") { lied1.genre1 = HardRock; }
also ohne die seltsamen zeichen die wir noch nich hatten. funktioniert aber nun auch alles auch im zusammenhang mit dem restlichen programm.