Prä- und Postfix-Increment sowie Umwandlungsoperator



  • 1.)

    class X() {};
    X obj;
    

    wenn ich schreibe

    int s = obj;
    

    Wie kann ich da überladen, damit obj auch einen int zurückliefert?
    Oder geht das nur mit get()-Methode?

    2.) Wie muss der operator++ überladen werden? Mit

    int operator++() {
       return v++;
    }
    

    bekomm ich bei der Anwendung obj++ eine Warnung.

    [ 05.10.2001: Beitrag editiert von: HumeSikkins ]



  • Hallo,

    class X
    {
        int x;
        public:
            X(int i = 0) : x(i) {}
            operator int() {return x;}  // Umwandlungsoperator X ->int
            // pre-Increment
            X& operator++()
            {
                ++x;
                return *this;
            }
    
            // post-Increment
            const X operator++(int)
            {
                X Temp(x);
                ++*this;
                return Temp;
            }
    
    };
    

    Für 1) benötigst du einen Umwandlungsoperator von deiner Klasse X nach int.

    Zu 2). Du definierst nur den Prefix-Increment-Operator. In meinem Beispiel siehst du die Syntax für den Postfix-Increment. Es ist generell eine gute Idee den Postfix-Increment über den Prefix-Increment-Operator zu implementieren (auch wenn das hier nicht nötig ist). Beachte auch die Rückgabewerte. Einmal eine Referenz auf das Objekt und einmal ein const X. Letzteres verhindert Ausdrücke wie z.B. x++++.

    [ 05.10.2001: Beitrag editiert von: HumeSikkins ]



  • zu 1)
    Man kann einen Cast-Operator in der Klasse definieren:

    class X {
      operator int() { return __blub__; }
    };
    

    Mein Tipp, schreib eine spezielle Funktion, Cast-Funktionen haben seiteneffekte und machen den Code nicht unbedingt lesbarer nur kürzer:

    class X {
      int to_int() { return __blub__; } // oder as_int, oder einen besseren Namen
    };
    
    X obj;
    int s = obj.to_int();
    

    Den Operator definiert man am besten auch in der Klasse:

    class X {
      X& operator++() { ++was_weiss_ich; return *this; } // für ++x
      X operator++(int) { // für x++
        X tmp = *this; // Kopie anlegen
        ++*this; // erhöhen mit der anderen Funktion
        return tmp;
      }
    };
    

    Hier sieht man auch, warum bei eigenen Typen man ++x (statts x++) nehmen sollte, diese Variante kommt ohne temporäre Objekte aus und ist deshalb schneller.

    cu


Anmelden zum Antworten