Operatoren in der Klasse oder global definieren?
-
Hallo,
wo sollte man arithmetische Operatoren für eine Klasse (z.B. Point, Vector, ...) definieren? Und was ist mit Operatoren wie +=, -=, *=, /= ... ?
Global oder in der Klasse selbst?Danke für Ra(d|t)schläge!
-
Für Vektoren spricht doch nichts dagegen, die arithmetischen Operatoren zu überladen. Ob es mathematisch sinnvoll ist, Punkte zu addieren/multiplizieren, ist da ne andere Frage...
Ob global oder nicht: Das hängt davon ab, ob man Standardkonvertierungen für den linken Operand haben möchte. Da die bei +=, -/, *=... sowieso flach fallen, würde ich die in der Klasse implementieren.
Für +, - ,* und / wäre es aber evtl. sinnvoll, die Operatoren global zu definieren. Allerdings ist halt die Frage ob es für Punkte und Vektoren überhaupt standardkonvertierungen gibt, z.B. von einem double zu einem Vector

Felix
-
normalerweise fährste gut damit, +=, -=. *= und so in der klasse selbt zu definieren. da haste eh den zwang, daß der linke op eine instanz deiner klasse ist.
und +, -, * und so global. da willste dann auch auf den linken op automatische konvertierungen zulassen und außerdem kannste oft nen op+ definieren, indem du den op+= benutzt, dann brauchste nichtmal friend zu verwenden. friend ist nämlich zu meiden, wenn es ohne performanceverlust und lesbarkeitsverlust vermeidbar ist.
die globalen operatoren und die lokalen gehören zur schnittstelle der klasse. die lokalen und die, die friend sind, nenne ich mal die "innere schnittselle". du mußt nur die "innere schnittstelle" mit assert und/oder throw aussatten bzw irgenwann später bei fiesen rechenfehlern loggen und prüfen. da wir mindestens zehnmal so viel zeit mit der fehlersuche verbringen, als mit dem coden selber, sollten wir die fehlerkritischen punkte in ihrer anzahl gering halten. besonders fehlerkritisch ist bei jeder klasse eine funktion, die schreibenden zugriff auf die attribute hat. denn ein mistschreib wirkt sich unter bösen umständen erst 200 frames später aus und dann hat man bei der fehlersuche glatt verkackt.