Überladen des Inkrement-Operator



  • BitWax schrieb:

    Und das Template wollte ich benutzen, damit ich nicht für jeden Zahl-Typ (int, float, double, etc.) den Operator überladen muss.

    Du kannst Operatoren nicht für Build-in Typen überladen - mindestens ein Operand muß von einem selbstdefinierter Typ sein (beim Inkrement gibt es nur einen Operanden).



  • Hmmm. Also so wie ich da verstanden hatte (aus den Tutorials her) steht als erstes der Linke Bezeichner. Danach kommt der Operator und in den Klammern dann der rechte Bezeichner. Also:

    LINKS klasse::operator= (RECHTS)
    {
        LINKS = LINKS - RECHTS;
        return LINKS;
    }
    

    Das Beispiel soll nichts anderes machen, als das wenn man zum Beispiel schreibt:

    int a = 5, b = 3;
    a = b;
    

    Dass a dann eben gleich 2 ist.

    EDIT: die geschichte natürlich noch auf eine Klasse angewendet.



  • so natürlich ist das nicht, denn unter c++ sind die datentypen keine eigenständigen klassen



  • ich verbesser das mal, eben auf eine klasse angewendet:

    LINKS& klasse::operator= (RECHTS)
    {
        LINKS = LINKS - RECHTS;
        return LINKS;
    }
    .
    .
    .
    klasse kl;
    kl.a = 5;
    kl.b = 3;
    
    kl.a = kl.b;
    


  • Vielleicht solltest du dir nochmal den Unterschied zwischen Typ und Variable ansehen. (oder reden wir hier von einer typlosen Scriptsprache mit C++ ähnlicherSyntax?)

    //als Methode
    //  linker Operand ist *this (Typ LINKS)
    //  rechter Operand ist r (Typ RECHTS)
    //  Rückgabe hat Typ ERGEBNIS
    ERGEBNIS LINKS::operator*(RECHTS r)
    {
      ERGEBNIS e = mult(*this,r);
      return e;
    }
    //bzw:
    //als globale Funktion
    ERGEBNIS operator*(LINKS l,RECHTS r)
    {
      ERGEBNIS e = mult(l,r);
      return e;
    }
    

    Und der operator= einer Klasse bezieht sich nicht auf Zuweisungen zwischen Membervariablen, sondern auf Zuweisungen der Klasse gesamt:

    klasse k1,k2;
    k1=k2;//hier greift op=
    


  • Achso! ich dachte das hier

    blabla::operator...

    muss eine klasse sein! zumindest blabla.



  • BitWax schrieb:

    Achso! ich dachte das hier

    blabla::operator...

    muss eine klasse sein! zumindest blabla.

    Strenggenommen (ohne Zusammenhang) muss blabla hier eine Klasse oder ein Namespace sein.



  • Ich habe das jetzt mal versucht, einen Operator global zu überladen:

    int operator+ (int l, int r)
    {
        return l - r;
    }
    

    und das sagt er mir beim compilieren:

    Error E2082 main.cpp 5: 'operator +(int,int)' must be a member function or have
    a parameter of class type
    

    und so probiere ich es

    int main ()
    {
        int a = 5;
        int b = 4;
    
        cout << a + b << endl;
    
        return 0;
    }
    

    Bitte nicht schlagen, wenns komplett falsch ist, aber das ist echt absolutes Neuland.



  • Auch für globale Operatorfunktionen gilt, was LordJaxom und ich vorhin gesagt haben:

    CStoll schrieb:

    BitWax schrieb:

    Und das Template wollte ich benutzen, damit ich nicht für jeden Zahl-Typ (int, float, double, etc.) den Operator überladen muss.

    Du kannst Operatoren nicht für Build-in Typen überladen - mindestens ein Operand muß von einem selbstdefinierter Typ sein (beim Inkrement gibt es nur einen Operanden).



  • auf deutsch: selbst wenn ich den global überladen will, muss immer eine eigene klasse/struktur damit verbunden werden?



  • Ja, oder anders gesagt: Der Compiler verbietet Dir aus gutem Grund, die Bedeutung von (z.B.) 1+1 zu ändern.



  • Schade! Eigentlich wollte ich ne DLL basteln, dort alle Operatoren verändern und die DLL dann rausgeben[/ironie]
    Naja, versteh schon warum, aber das nervt mich gerade ein bisschen...



  • geht denn sowas

    #typedef + = &
    

    dann gibts ne Binär-Addition :p

    Edit: nee, geht nicht



  • #typedef + = &
    

    😃 👍



  • #define ++ --


Anmelden zum Antworten