2016-06-18 11 views
0

Also habe ich eine einfache Klasse:Overloading Betreiber außerhalb der Klasse

class complex{ 

private: 

    double a,b; 

public: 

    void setA(double a){ this->a=a; } 

    void setB(double b){ this->b=b; } 

    double getA(){ return a; } 
    double getB(){ return b; } 

    friend complex operator+(const complex&, const complex&); 
}; 

Und ich habe den tatsächlichen überladenen Operator hier:

complex operator+(const complex& x, const complex& y){ 

    complex c; 
    c.a=x.a+y.a; 
    c.b=x.b+y.b; 
    return c; 
} 

ich den Betreiber außerhalb der Funktion überlastet haben muß . Um Zugriff auf private Variablen zu haben (diese müssen auch privat sein), habe ich mich mit der Klasse angefreundet. Ich weiß nicht, ob das richtig ist, aber zumindest funktioniert es. Ich möchte eine Ganzzahl zu beiden Mitgliedern hinzufügen können. In main():

complex a; 
a.setA(2); 
a.setB(3); 
a+5; 

Würde dazu führen, dass a.a = 7 und a.b = 8. Eine solche Überlastung im Inneren ist die Klasse ganz einfach (auch hier weiß nicht, ob das ist gute Lösung, wenn nicht bitte korrigieren Sie mich) zu machen:

complex operator+(int x){ 

    this->a+=x; 
    this->b+=x; 
} 

Aber ich habe keine Ahnung, wie es außerhalb der Klasse zu machen, weil Ich kann diesen "Zeiger" nicht verwenden.

+0

Operatoren, die innerhalb der Klasse implementiert sind, müssen den Parameter für den linken Operanden weglassen und stattdessen 'this' verwenden. Operatoren, die außerhalb der Klasse implementiert sind, müssen den Parameter für den linken Operanden haben und können 'this' nicht verwenden. Ihr Klassenmember 'operator +()' wurde jedoch falsch implementiert, Sie sollten die Werte von 'this' nicht ändern, der Operator gibt ein neues Objekt zurück, also ändern Sie das stattdessen. –

Antwort

3

Der übliche Ansatz für diese Art von Problem besteht darin, Elementfunktionen zu haben, die die reflexive Version von arithmetischen Operatoren und freien Funktionen definieren, die die nichtreflexive Version definieren, die mit der reflexiven Version implementiert wird. Keine Freundschaftsdeklarationen benötigt. Zum Beispiel:

class complex { 
public: 
    complex& operator+=(const complex& rhs) { 
     x += rhs.x; 
     y += rhs.y; 
     return *this; 
    } 
private: 
    double x, y; 
}; 

complex operator+(const complex& lhs, const complex& rhs) { 
    complex result = lhs; 
    result += rhs; 
    return result; 
} 

Mit a+5 Änderung der Wert von a ungewöhnlich ist, aber wenn das wirklich ist wha Sie wollen, operator+(int) Mitglied machen. Benutzer würden jedoch normalerweise erwarten, dass a+5a unverändert lassen würde, und dass a += 5a ändern würde.

+0

"Stunden" ist ein Tippfehler? –

+0

@ard_evon - es ist eine Rechtschreibprüfung-o. Fest. Vielen Dank. –