003
05.08.2008, 16:21 Uhr
stephanw
localhorst
|
3 Dinge:
1.) Hast Du auch eine Klasse Vector für Vektoren im Raum ? Dann wäre es sinnvoll, die Addition von Punkt und Punkt nicht zu ermöglichen, weil dies mathematisch nicht richtig ist. Man kann einen Vektor zu einem Punkt addieren und erhält wieder einen Punkt. Aber zwei Punkte kann man nicht addieren.
2.) Dein Code verwendet einen "-"-Operator, obwohl Du von "+" schreibst. Ich gehe mal davon aus, dass Du Dich beim "-" verschrieben hast oder Du den "-"-Operator in gleicher Weise implementiert hast.
3.) Zum eigentlichen Problem:
Deine Implementierung von Point::operator+() verändert doch die Member-Variablen der Instanz, für die er aufgerufen wird (linksseitiger Operand). Von daher ist es klar, dass der Punkt in pointvec[i] verändert werden. Was Du aber offenbar möchtest ist, einen neuen Punkt als Summer der beiden Operanden anzulegen.
Du kannst jetzt zwei Dinge tun: a.) Entweder implementierst Du Deinen Operator auf diese Weise:
C++: |
class Point { .. Point operator+(const Point& p) { Point result; result.x = x + p.x; ... return result; }
|
oder
b.) Du verwendest für den Operator keine Member-Funktion, sondern eine globale Funktion (oder in einem Namespace, jedenfalls keine Member-Funktion):
C++: |
Point operator+(const Point& a, const Point& b) { Point result; ... return result; }
|
Diese Option b.) ist besser, weil sie der gewünschten Semantik am besten entspricht.
Es gibt eine gute Konvention: Operatoren, die keine Member-Variablen ändern (so wie "+","-", usw.) sind auch keine Member-Funktionen. Sie müssen also global oder in einem passenden Namespace definiert werden. Operatoren, die das Objekt ändern sollen, sind auch Member-Funktionen. Beispiele dafür ist z.B. "+=", "-=" usw. -- Reden ist Schweigen und Silber ist Gold. |