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 du Fruit&als Parameter weglassen - und je nachdem keinen oder den int Parameter verwenden.
    Mittels thishast du ja Zugriff auf die Instanz (anstatt f).

    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 noch friend 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

    @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 sollte const sein und es fehlt return 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 mittels switch-case).