enum - wer hat Recht? Compiler oder Buch ;)
-
hab hier in meinen Buch, das sich angeblich an den aktuellen C++ Standard hält, folgenden Code stehen:
#include <iostream> using namespace std; enum Tage {Montag, Dienstag, Mittwoch, Donerstag, Freitag, Samstag, Sonntag}; int main() { for(Tage m = Montag; m < Sonntag; m++) { cout<<m<<endl; } }Bekomme die Fehlermeldung:
Error 1 error C2676: binary '++' : 'Tage' does not define this operator or a conversion to a type acceptable to the predefined operator c:\dokumente und einstellungen\julian\desktop\lern\lern\main.cpp 9Wer hält sich nun nicht an den C++ Standard? mein Buch oder mein Compiler?
-
Ist das 1 zu 1 übernommen aus dem buch?
Manchmal sinds nur kleinigkeiten
-
so stehts im Buch (mit der gleichen Einrückung - schön unübersichtlich

#include <iostream> using namespace std; enum wert {sieben,acht,neun,bube,dame,koenig,zehn,as}; enum farbe {karo,herz,pik,kreuz}; int main() { for (farbe f=karo; f<=kreuz; f++) for (wert w=sieben; w <= as; w++) { switch(f) { case karo : cout<< "Karo";break; case herz : cout<< "Herz";break; case pik : cout<< "Pik";break; case kreuz : cout<< "Kreuz";break; } switch(w) { case sieben: cout<< "-Sieben\n"; break; case acht: cout<< "-Achter\n"; break; case neun: cout<< "-Neuner\n"; break; case bube: cout<< "-Bube\n"; break; case dame: cout<< "-Dame\n"; break; case koenig: cout<< "-Koenig\n"; break; case zehn: cout<< "-Zehner\n"; break; case as: cout<< "-As\n"; break; }} return 0; }
-
Schmeiss das Buch weg!
-
sollte man nicht noch
//Postfix op... ++w wert operator++(wert &w) { w = wert((w+1) % 8); return w; } // ++f wert operator++(farbe &f) { f = wert((f+1) % 4); return f; }hinzufügen?
Oder eben das Suffix++. Sonst gehts doch garnicht, oder?
-
#include <iostream> using namespace std; enum Tage {Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag}; int main() { int m = 0; for(m = 0; m < 6; m++) { switch(m) { case Montag : { cout<< "Montag" << endl; } break; case Dienstag : { cout<< "Dienstag" << endl; } break; case Mittwoch : { cout<< "Mittwoch" << endl; } break; case Donnerstag : { cout<< "Donnerstag" << endl; } break; case Freitag : { cout<< "Freitag" << endl; } break; case Samstag : { cout<< "Samstag" << endl; } break; case Sonntag : { cout<< "Sonntag" << endl; } break; } } }Der funktioniert. Wahlweise auch mit IF

Wichtig ist eigentlich nur das du nicht Sonntag++ sagen kannst! Funktioniert halt nur bei Int usw. - glaube ich

-
Der Compiler hat recht, nimm in der Schleife statt Tag int oder size_t
-
CompilerIstImRecht schrieb:
nimm in der Schleife statt Tag int oder size_t
warum size_t und nicht double?
-
volkard schrieb:
CompilerIstImRecht schrieb:
nimm in der Schleife statt Tag int oder size_t
warum size_t und nicht double?
, was sollen denn Gleitkommazahlen in einer Aufzählung bringen?MfG SideWinder
-
SideWinder schrieb:
volkard schrieb:
CompilerIstImRecht schrieb:
nimm in der Schleife statt Tag int oder size_t
warum size_t und nicht double?
, was sollen denn Gleitkommazahlen in einer Aufzählung bringen?volkard benutzt wohl mal wieder seine sokratisches-fragen-methodik, um die leute zu veralbern...
-
SideWinder schrieb:
, was sollen denn Gleitkommazahlen in einer Aufzählung bringen?
, was soll denn ein size_t in einer Aufzählung bringen? warum ein teurer size_t mit 64 bit und kein time_t mit nur 32 bit? das ist doch die entscheidende frage. oder hat sich da einer angewöhnt, immer size_t statt unsigned zu schreiben?
-
provozieren ist okay, aber dann bitte nur reaktionen und nicht leute.

-
volkard schrieb:
[...]
, was soll denn ein size_t in einer Aufzählung bringen? warum ein teurer size_t mit 64 bit und kein time_t mit nur 32 bit? das ist doch die entscheidende frage. oder hat sich da einer angewöhnt, immer size_t statt unsigned zu schreiben?size_t für den Fall, dass enum größer ist als int
-
#include <iostream> using namespace std; enum Tage {Montag, Dienstag, Mittwoch, Donerstag, Freitag, Samstag, Sonntag}; int main() { for(Tage m = Montag; m < Sonntag; m = static_cast<Tage>((static_cast<int>(m)+1))) { cout<<m<<endl; } }Das geht auch :p
, jedenfalls läßt es sich kompilieren, ob es eine Endlosschleife gibt, hab ich aber noch nicht getestet, sollte aber gehen.Felix
-
würde nicht
m = Tage(m+1)reichen?
-
Das gibt imo kein Sinn so etwas zu machen bei enums. Denn man kann auch sowas machen:
enum myEnum { a, b = 123, c };Also kann es auf jeden Fall generell nicht gehen.
Gruß
-
Fireflow[off] schrieb:
Das gibt imo kein Sinn so etwas zu machen bei enums. Denn man kann auch sowas machen:
enum myEnum { a, b = 123, c };Also kann es auf jeden Fall generell nicht gehen.
Grußgenau deswegen geht es nicht ohne cast. der cast ist meine botschaft an den compiler "vertrauen sie mir, ich weiß, was ich tue".
-
CompilerIstImRecht schrieb:
size_t für den Fall, dass enum größer ist als int
Was aber praktisch unwahrscheinlich ist.
It is implementation-defined which integral type is used as the underlying type for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int or unsigned int.
Was im konkreten Fall bedeuten würde, int kann nicht den Wert 6 darstellen. Und dann bringt size_t wohl auch nichts mehr.
-
Der Autor ist der Meinung das ein Destruktor die Überladung des Bit-Komplement-Operators darstellt - ich wunder mich gerade warum das Buch schon in der 6. Auflage erschienen ist - bei uns wurde es sogar in der C++ Vorlesung empfohlen...
-
LOL!
-
das geilste was ich bisher im Buch gesehen habe:
#include <iostream> using namespace std; template<int N> class Fakultaet { public: enum{value = N*Fakultaet<N-1>::value}; }; template<> class Fakultaet<0> { public: enum{value = 1}; }; int main() { const int x = Fakultaet<6>::value; cout << x <<endl; cin.get(); return 0; }