Operator X und X=



  • Hi,

    ich frage mich wie ich folgene Operatoren am besten überlade:

    [cpp]
    operator + (klasse);
    operator += (klasse);
    [/code]

    sollte ich im += operator den + operator benutzen oder anders? Wie mach ich es am effektivsten und so, das es auch am schnellsten ist?



  • ich glaube, daß es da keine allgemeine Regel gibt, aber ich benutze meist den op+= im op+, wenn es sinnvoll erscheint. So sparst du dir einiges an Code, da sie sich sehr ähnlich sind.
    einfaches Bsp:

    MATRIX & MATRIX::operator+=(const MATRIX & matSource){
      for(int row=0; row<numOfRows ;row++){
        for(int column=0; column<numOfColumns ;column++){
          element[row][column] += matSource.element[row][column];
        }
      }
      return * this;							
    }
    MATRIX operator+(const MATRIX & mat01, const MATRIX & mat02){
      MATRIX matSum(mat01);
      matSum += mat02;
      return matSum;
    }
    


  • --- schrieb:

    ich frage mich wie ich folgene Operatoren am besten überlade:

    operator + (klasse);
    operator += (klasse);
    

    operator+ als non-Member mit der Signatur:

    const Klasse operator+(const Klasse& lhs, const Klasse& rhs);
    

    operator+= als Member mit der Signatur:

    Klasse& operator+=(const Klasse& rhs);
    

    sollte ich im += operator den + operator benutzen oder anders?

    Andersherum. Im Allgemeinen solltest du den operator+ über den Copy-Ctor und den +=-Operator implementieren:

    class Klasse
    {
    public:
         ...
         Klasse& operator+=(const Klasse& rhs)
         {
             // Additionscode
             return *this;
         }
    };
    
    Klasse operator+(const Klasse& lhs, const Klasse& rhs)
    {
       Klasse temp(lhs);
       temp += rhs;
       return temp;
    }
    


  • @HumeSikkins: meine Rede (d.h. das wollte ich sagen)
    HumeSikkins.isRight() == true; // 👍



  • Ausdrücke, wie == true, solltest du dir sparen, man kann diese einfach weglassen.

    MfG Eisflamme



  • @HumeSikkins
    wie sieht denn der additionscode aus???



  • @---:
    Das kommt ganz auf deine Klasse an. Als Beispiel Komplexe Zahlen:

    complex& complex::operator+=(const complex& c)
    {
        im += c.im;
        re += c.re;
    
        return *this;
    }
    

    Wie gesagt, hängt von deiner Klasse ab



  • @Deadlef: ist ja richtig, aber ich glaube '---' meinte das nciht so ernst, wohl eher so etwas:

    HUMAN operator+(const HUMAN & HumeSikkins, const HUMAN & gegenstueck){
      HUMAN result(HumeSikkins);
      result += gegenstueck;
      return result;
    }
    

    .....................bitte nicht schlagen......



  • freshman schrieb:

    HUMAN operator+(const HUMAN & HumeSikkins, const HUMAN & gegenstueck)
    

    wohl eher

    const HUMAN operator+(const HUMAN & HumeSikkins, const HUMAN & gegenstueck)
    


  • const HUMAN operator+(const HUMAN & HumeSikkins, const HUMAN & gegenstueck)
    

    begründung?



  • auf die Begründung bin ich ja auch mal gespannt!
    @HumeSikkins: war nur Spaß, net bös sein



  • int main()
    {
        int a = 1, b = 2, c = 3;
        a + b = c;
    }
    

    g++ schrieb:

    test.cpp: In function `int main()':
    test.cpp:4: error: non-lvalue in assignment

    do like the ints do.



  • int a[5];
    int* i=a;
    *(i+1)=3;
    

    oder auch:

    vector<int> vector(10,5);
    vector<int>::iterator iterator=vector.begin();
    *(iterator+3)=2;
    


  • @C Newbie
    Jup. Sehr guter Hinweis. Ich werde meinen Beitrag entsprechend korrigieren.



  • int main()
    {
            int a[5];
            int* i=a;
            i+1=3;
    }
    

    g++ schrieb:

    test.cpp: In function `int main()':
    test.cpp:5: error: non-lvalue in assignment

    🙄 :p



  • hm ich glaube wir reden dran vorbei.

    Ok, ich geb ne klasse vor und ihr sagt mir wie die aussehen müsste mit den beiden Operatoren, ist glaub ich am einfachsten für alle:

    class Vector4D
    {
    public:
        double x;
        double y;
        double z;
        double w;
    };
    


  • zur Halbzeit: C Newbie : otze : freshman 1 : 0 : 0
    CNewbie.isRight();
    freshman.say("respect");



  • C Newbie schrieb:

    int main()
    {
            int a[5];
            int* i=a;
            i+1=3;
    }
    

    g++ schrieb:

    test.cpp: In function `int main()':
    test.cpp:5: error: non-lvalue in assignment

    🙄 :p

    sorry, ein *() vergessen^^



  • aber doch wohl die Attribute als private, like:

    class Vector4D
    {
    private:
        double x;
        double y;
        double z;
        double w;
    public:
        Vector4D & operator+=(const Vector4D & vecSource);
        friend const Vector4D operator+(const Vector4D & vec01, const Vector4D & vec02);
        //oder als freie Fkt??
    }; 
    
    Vector4D & Vector4D::operator+=(const Vector4D & vecSource){ 
      x += vecSource.x;
      y += vecSource.y;
      z += vecSource.z; 
      w += vecSource.w;
      return * this;                            
    } 
    const Vector4D operator+(const Vector4D & vec01, const Vector4D & vec02){ 
      Vector4D vecSum(vec01); 
      vecSum += vec02; 
      return vecSum; 
    }
    


  • Um das mal in eine lesbare Form zu bringen

    int a[5];
    int* i=a;
    *(i+1)=3;
    // ist gleich
    i[1] = 3;
    


  • @Freshman:
    muss das nicht so lauten?

    Vector4D & Vector4D::operator+=(const Vector4D & vecSource){ 
      x += vecSource.x; 
      y += vecSource.y; 
      z += vecSource.z; 
      w += vecSource.w; 
      return * this;                             
    }
    

Anmelden zum Antworten