Polymorphie mit Operatorenüberladung
-
Also ich habe folgendes: meine abstrakte Basisklasse definiert sämtliche Operatoren, und die abgeleiteten Klassen übernehmen diese. Sämtliche Parameter, Rückgabetypen sind Zeiger. Eine typische Operatorenüberladung sieht zur zeit so aus:
MathObject* BaseXInteger::operator+(const MathObject* other) constallerdings stört mich jetzt, dass der Anwender, wenn er reine Instanzen nimmt, keine Zeiger, sehr umständlich die operatoren nur benutzen kann, da ich eben Zeiger benutze
Jetzt frage ich mich, ob meine Idee mit den Zeigern gut war, oder ob ich es anders definieren sollte?
-
so 100% verstanden hab ich es jetzt nicht, aber statt zeigern kannst du in c++ auch referenzen nehmen.
-
Schlecht.
Will der User c=a+b schreiben, sollst duMathObject operator+(const MathObject& a,const MathObject& a)anbieten.
Wenn ihm das Kopieren zu langam ist, soll er deinen
MathObject& BaseXInteger::operator+=(const MathObject& b) constbevorzugen.
Außerdem ist immer zu schauen, ob die RVO greift und man da gar nicht optimimieren muß.
Willst Du sowas machen, daß Number(1)*(Number(2)+Var(a)) zu Sum(Number(2)*Var(a)) wird, nimm besser keine Operatorüberladunf, sondern plus, minus und so.
-
uhsuhz schrieb:
Eine typische Operatorenüberladung sieht zur zeit so aus:
Das ist alles andere als üblich. Üblich ist es, Objekte zu übergeben, keine Zeiger. Ein Anwender muss sich also erstmal durch dein Doku wälzen bevor er die Operatoren überhauot benutzen kann.
Jetzt frage ich mich, ob meine Idee mit den Zeigern gut war, oder ob ich es anders definieren sollte?
Nein, die Idee war nicht gut, und ja, du solltest es anders definieren.
Siehe auch hier für mehr Infos zu typischen Überladungen.
-
pumuckl schrieb:
uhsuhz schrieb:
Eine typische Operatorenüberladung sieht zur zeit so aus:
Das ist alles andere als üblich. Üblich ist es, Objekte zu übergeben, keine Zeiger. Ein Anwender muss sich also erstmal durch dein Doku wälzen bevor er die Operatoren überhauot benutzen kann.
-> Damit meinte ich in meiner klasse, und nicht generell alle operatoren überladungen sämtlicher coder

Eigentlich hatte ich vor mit referenzen zu arbeiten, doch dann gibt mir der compiler ne fehlermeldung aus, dass MathObject nicht instanziert werden kann weil sie abstrakt ist... Das ist auch der Grund weshalb ich überhaupt Zeiger benutzt habe.
Ich glaube ich werde keine operatoren überladen, sondern dann Funktionen schreiben und überladen, da später sämtliche Objekte als Zeiger auf die Basisklasse deklariert werden und dann mit dem abgeleiteten Typ initialisiert werden, so dass ich die späte bindung ausnutzen kann, um nicht immer wissen zu müssen um welchen Typ es sich gerade handelt. Ich hoffe das war jetzt klar

-
uhsuhz schrieb:
Eigentlich hatte ich vor mit referenzen zu arbeiten, doch dann gibt mir der compiler ne fehlermeldung aus, dass MathObject nicht instanziert werden kann weil sie abstrakt ist... Das ist auch der Grund weshalb ich überhaupt Zeiger benutzt habe.
Dann hast du sie eben falsch angewandt. Instanziiert werden muss mit Referenzen genauso wenig wie mit Zeigern.