PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ operator und Klammern


rotalever
2009-02-27, 15:29:22
Ich habe eine Klasse, in der auch zwei Rechenoperatoren (operator* und operator-) für diese Klasse definiert werden.

Wenn ich jetzt die Rechnung a*(b-c) mache, wobei a,b,c alles Objekte dieser Klasse sind, dann will der Compiler nicht kompilieren und sagt mir, dass er keinen Operator finden kann. Wenn die Rechnung aber (b-c)*a lautet geht es. Der operator- liefert übrigens wieder ein Objekt dieser Klasse zurück.

Woran liegt das, und was kann man machen, damit beide Wege möglich sind.

Xmas
2009-02-27, 15:34:57
Wie genau sind die Operatoren deklariert?

rotalever
2009-02-27, 16:06:04
Wie genau sind die Operatoren deklariert?

class Bla {
public:
double a;
double b;
Bla operator-(Bla &t) {
Bla r;
r.a = a - b.a;
r.b = b - b.b;
return r;
}
double operator*(Bla &t) {
return a*t.a + b*t.b;
}
};

Coda
2009-02-27, 16:13:58
http://www.java2s.com/Tutorial/Cpp/0180__Class/Usefriendoperatorfunctions.htm

Marscel
2009-02-27, 16:20:47
Guck dir das mal an: http://www.imb-jena.de/~gmueller/kurse/c_c++/c_friend.html

Xmas
2009-02-27, 16:49:47
Ob friend oder nicht ist eher eine ästhetische Entscheidung in diesem Fall, aber Memberfunktionen sollten als const deklariert werden wenn sie das Objekt nicht verändern, dasselbe gilt für Referenzparameter:
class Bla
{
public:
Bla operator-(const Bla &t) const;
};

rotalever
2009-02-27, 16:59:09
Ob friend oder nicht ist eher eine ästhetische Entscheidung in diesem Fall, aber Memberfunktionen sollten als const deklariert werden wenn sie das Objekt nicht verändern, dasselbe gilt für Referenzparameter:
class Bla
{
public:
Bla operator-(const Bla &t) const;
};
Fein, jetzt geht es. Woran liegt das, dass man das als const deklarieren muss?

rotalever
2009-02-27, 17:01:36
http://www.java2s.com/Tutorial/Cpp/0180__Class/Usefriendoperatorfunctions.htm
Gibt es da auch eine Begründung?

Xmas
2009-02-27, 19:02:32
Fein, jetzt geht es. Woran liegt das, dass man das als const deklarieren muss?
Temporäre Objekte (also beispielsweise der Rückgabewert von (b - c)) können nur an const-Referenzen gebunden werden.

rotalever
2009-02-27, 19:31:06
Temporäre Objekte (also beispielsweise der Rückgabewert von (b - c)) können nur an const-Referenzen gebunden werden.
Ah Ok, stimmt. Ich hatte mich nämlich gewundert warum es in der einen Richtung geht, aber in der anderen nicht. Wenn man (b-c) als erstes macht wird es ja gar nicht als referenziert...