enum class inkrement
-
Hallo zusammen,
warum ist diesem Codeabschnitt der operator++ nicht richtig?
enum class Fruit { apple, banana, orange, pineapple, lemon }; Fruit& operator++(Fruit& f) { switch (f) { case Fruit::apple: return f = Fruit::banana; case Fruit::banana: return f = Fruit::orange; case Fruit::orange: return f = Fruit::pineapple; case Fruit::pineapple: return f = Fruit::lemon; case Fruit::lemon: return f = Fruit::apple; } }
Ich bekomme immer diese Fehlermeldung:
error C2807: Der zweite formale Parameter auf den Postfix-Operator "++" muss den Typ "int" haben
-
Es gibt für Prä- und Postfix-Operatoren zwei verschiedene Signaturen: Increment/decrement operators
Der zusätzliche Parameter (
int
) ist nur ein Dummy, um die beiden Operatoren auseinanderhalten zu können.Edit:
OK, jetzt sehe ich den konkreten Fehler! Du hast den Operator als Klassenmember deklariert (und nicht als freie Funktion), daher mußt duFruit&
als Parameter weglassen - und je nachdem keinen oder denint
Parameter verwenden.
Mittelsthis
hast du ja Zugriff auf die Instanz (anstattf
).
Nonsense, sorry!
-
@th69
ehrlich gesagt verstehe ich immer noch nicht was muss ich tun, damit ich diese fehlermeldung umgehen kann.
-
Hast du mein "Edit" gelesen?
-
@th69
jetzt ja
danke
-
Kann ich denn so schreiben?
enum class Fruit { apple, banana, orange, pineapple, lemon }; Fruit& f; /// Non-scalable way Fruit operator++() { switch (f) { case Fruit::apple: return f = Fruit::banana; case Fruit::banana: return f = Fruit::orange; case Fruit::orange: return f = Fruit::pineapple; case Fruit::pineapple: return f = Fruit::lemon; case Fruit::lemon: return f = Fruit::apple; } }
danke
-
Nein, das ergibt keinen Sinn (also der zusätzliche Member).
Ich habe doch deinen ersten Beitrag falsch gelesen, dachte du hättest den Operator innerhalb der Klasse definiert (aber das geht bei
enum
ja gar nicht), aber ist ja doch richtig so.Wie rufst du denn den Operator auf?
Mit Ideone-Code kompiliert dein Originalcode wunderbar.
-
@th69
ich habe den operator innerhalb der Klasse definiert und deswegen habe ich die oben erwähnten Fehlermeldung bekommen.
Ich möchte aber weiterhin diese innerhalb der klasse benutzen, aber wie ich das geändert habe macht keinen Sinn.
-
Du hast also eine äußere Klasse, in der du sowohl
enum class Fruit
als auch den Operator definiert hast?
Ok, dann setze nochfriend
vor den Operator, s. Ideone-Code.PS: Es wäre schön gewesen, wenn du gleich im ersten Beitrag noch dazugeschrieben hättest (bzw. im Code), daß sich beide Definitionen innerhalb einer anderen Klasse befinden (denn das ist wichtig sowohl von der Syntax als auch der Semantik)!
-
@th69 sagte in enum class inkrement:
Du hast also eine äußere Klasse, in der du sowohl enum class Fruitals auch den Operator definiert hast?
@ ja
Danke dir
-
Hallo,
da es um die gleich Thematik geht, habe ich folgende Frage:
Ich habe:
enum class Fruit { apple, banana, orange, };
ich möchte aber die ausgabe des Enums als string ausgeben.
Ich habe versucht folgende zu implementieren:std::ostream& operator<<( std::ostream& os, Fruit &fruit ) { switch( fruit ) { case Fruit::banana: os << "banana"; break; case Fruit::apple: os << "apple"; break; case Fruit::orange: os << "orange"; break; } }
Was ist daran falsch?
Danke
-
@sami sagte in enum class inkrement:
da es um die gleich Thematik geht
Ne, tut es eigentlich nicht. Nächstes mal: Genau eine Frage pro Thema und genau ein Thema pro Frage. "So ähnlich" zählt nicht.
@sami sagte in enum class inkrement:
Was ist daran falsch?
Der Parameter
fruit
sollteconst
sein und es fehltreturn os;
.
-
@swordfish sagte in enum class inkrement:
Der Parameter fruit sollte const sein und es fehlt return os;
meinst es so :
std::ostream& operator<<( std::ostream& os, const Fruit& fruit ) { switch( fruit ) { case Fruit::banana: os << "banana"; return os; case Fruit::apple: os << "apple"; return os; case Fruit::orange: os << "orange"; return os; } }
Es ist aber trotzdem falsch?
-
@sami sagte in enum class inkrement:
meinst es so :
Kann man so machen.
@sami sagte in enum class inkrement:
Es ist aber trotzdem falsch?
Wenn Du sagen, Code seien falsch, ich annehmen deine Compiler nicht mögen Deine Code. Du bitte nicht nur sagen Deine Code seien "aber trotzdem falsch" .. bitte sagen, was sagen Compiler? und bitte auch sagen ganze Code Du geben Compiler.
-
@swordfish
Fehlermeldung:Fehler C2678 Binärer Operator "<<": Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ "std::ostream" akzeptiert (oder keine geeignete Konvertierung möglich)
-
@sami Versuchs mal mit
#include <ostream>
P.S.: Persönlich würde ich nicht das Mapping Fruit -> string Repräsentation in den operator<< packen, sondern separat. (array oder switch-case). Evtl. möchte man später z.B. in einem GUI die Einkaufsliste anzeigen und braucht das wieder (aber nicht im operator<<) (nur ein Beispiel). (siehe was @Th69 weiter unten auch beschrieben hat)
-
Boah. Du nicht lesen, was ich sagen!?
@swordfish sagte in enum class inkrement:
und bitte auch sagen ganze Code Du geben Compiler.
-
Und wie sieht der zugehörige Code dazu aus?
Ich habe mal mein Beispiel erweitert: Ideone Code
PS: Ich persönlich würde diesen Operator mittels eines
const char * const
-Arrays implementieren (anstatt Code-Duplizierung mittelsswitch-case
).