wie kann ich den + operator definieren?
-
Shlo schrieb:
Welche Probleme hast du denn?
Ah ja:
*z += z2;
sollte heißen:
*z += *z2;
Bei seinem Code nicht.
@DEvent: Erst vor ein paar Tagen gab es große Threads über Operator-Überladung. Lies dir die mal durch, bevor wir hier wieder alles durchkauen. Dein op= und op+= ist etwas unglücklich. Warum übergibst du einen Zeiger?
Warum gibt op+ eine Referenz zurück? Warum hast du Funktionen wie add, sub wenn du die Operatoren überlädst? usw...
-
interpreter schrieb:
Warum gibt op+ eine Referenz zurück?
so hab ichs versucht, aber die Zahl ist ja abstrakt
-
Shlo schrieb:
interpreter schrieb:
Warum gibt op+ eine Referenz zurück?
so hab ichs versucht, aber die Zahl ist ja abstrakt
Und?
-
interpreter schrieb:
Und?
Wie und? Eine abstrakte Klasse kann nicht instanziiert werden und somit kann er keine Kopie zurückgeben. Deshalb ist es Blödsinn für eine abstrakte Klasse einen op+ zu überladen.
-
Shlo schrieb:
interpreter schrieb:
Und?
Wie und? Eine abstrakte Klasse kann nicht instanziiert werden und somit kann er keine Kopie zurückgeben. Deshalb ist es Blödsinn für eine abstrakte Klasse einen op+ zu überladen.
Ja eben. Genau deshalb fand ich ja dein Postings so sinnlos. Ein op+ gibt nun mal sinnvollerweise ein const T zurück. Wenn das nicht geht, dann ist was am Design falsch.
-
ich weis hab ich auch mit interesse verfolgt, aber da ging es um "wieso den + operator durch += implementieren", und um private/public und so zeug
ich definier die methoden, weil ich ja schlecht die operatoren +,-,*,... in einem interface ohne diese methoden implementieren kann. das interface hat ja keine attribute (deswegen interface). ich weis ja nicht zuvor, wie die addition definiert wird. bei nat. zahlen ist es z1 + z2, in brüchen ist es etwas komplizierter, da hast du 2 nenner und 2 zähler die miteinander in verbindung sind.
das mit den zeigern war blödsinn, geb ich zu, hab ich geändert.
Warum gibt op+ eine Referenz zurück?
wieso nicht?
-
interpreter schrieb:
Shlo schrieb:
interpreter schrieb:
Und?
Wie und? Eine abstrakte Klasse kann nicht instanziiert werden und somit kann er keine Kopie zurückgeben. Deshalb ist es Blödsinn für eine abstrakte Klasse einen op+ zu überladen.
Ja eben. Genau deshalb fand ich ja dein Postings so sinnlos. Ein op+ gibt nun mal sinnvollerweise ein const T zurück. Wenn das nicht geht, dann ist was am Design falsch.
ja und nu ?
gar kein op+ machen?oder für jede von Zahl abgeleitete klasse einen neunen op+ definieren?
-
DEvent schrieb:
Warum gibt op+ eine Referenz zurück?
wieso nicht?
Weil sowas unartig ist:
Zahl z1;
Zahl z2 = 3;
Zahl z3;
z1 + z2 = z3;
-
DEvent schrieb:
interpreter schrieb:
Shlo schrieb:
interpreter schrieb:
Und?
Wie und? Eine abstrakte Klasse kann nicht instanziiert werden und somit kann er keine Kopie zurückgeben. Deshalb ist es Blödsinn für eine abstrakte Klasse einen op+ zu überladen.
Ja eben. Genau deshalb fand ich ja dein Postings so sinnlos. Ein op+ gibt nun mal sinnvollerweise ein const T zurück. Wenn das nicht geht, dann ist was am Design falsch.
ja und nu ?
gar kein op+ machen?oder für jede von Zahl abgeleitete klasse einen neunen op+ definieren?
Wieso überhaupt so ein kompliziertes Design? Machs doch einfach ohne Vererbung.
-
wah, ohne vererbung? da kann ich doch gleich C programmieren ... :p
-
DEvent schrieb:
wah, ohne vererbung? da kann ich doch gleich C programmieren ... :p
Ha. Ertappt. Du versuchst also nur krampfhaft Vererbung einzubauen!
-
interpreter schrieb:
Ja eben. Genau deshalb fand ich ja dein Postings so sinnlos.
wtf? Jetzt schön der Reihe nach, Freundchen: bin ich derjenige der die Frage: "Warum gibt op+ eine Referenz zurück?" gestellt hat, oder du? Denn mindestens beim dritten Durchlesen des ersten Postings hättest feststellen müssen, dass der Threadersteller mit einer abstrakten Klasse arbeitet...
-
interpreter schrieb:
DEvent schrieb:
wah, ohne vererbung? da kann ich doch gleich C programmieren ... :p
Ha. Ertappt. Du versuchst also nur krampfhaft Vererbung einzubauen!
net krampfhaft, zumindest nicht im negativem sinne.
weil wie gesagt, die idee war ein ADT zu machen für zahlen. und da will ich die ganzen operatoren nur für den interface Zahl definieren, so das alle anderen Zahlen ( Complexe Zahlen, Brüche, usw ) diese operatoren bereits haben. sie müssen nur noch add(), sub(), div(), usw neu definieren, damit man auch 2 komplexe zahlen richtig addiert, subtrahiert usw.
rein theoretisch braucht man doch nur add, mul, kleiner, gleich um +, -, *, /, <, >, ==, !=, <=, >= zu implementieren.
z.b. a - b durch a + (-1) * b
* kann man ja auch duch + definieren
und / durch -der andere weg wäre es die methoden add(), sub, div, equal, grössergleich() usw public zu machen, aber wozu hab ich in c++ die möglichkeit operatoren zu überladen ?
oder sagt es einfach das man für eine abstrakte klasse wirklich keine möglichkeit besteht den operator + zu überladen. ich wollt halt wissen, ob ihr profis eine idee dazu habt. rumprobiert habe ich ja schon genug...
-
Shlo schrieb:
interpreter schrieb:
Ja eben. Genau deshalb fand ich ja dein Postings so sinnlos.
wtf? Jetzt schön der Reihe nach, Freundchen: bin ich derjenige der die Frage: "Warum gibt op+ eine Referenz zurück?" gestellt hat, oder du? Denn mindestens beim dritten Durchlesen des ersten Postings hättest feststellen müssen, dass der Threadersteller mit einer abstrakten Klasse arbeitet...
Und du hättest eigentlich bereits beim 1. Mal meines Postings merken können, dass das rhetorische Fragen waren.
Wenn jemand so eine Klasse schreibt:class Person { public: string name; /* ... */ };
und jemand fragt, warum name public ist, dann will man nicht wissen, WARUM er das so macht sondern ihn darauf hinweisen, dass es schlecht ist.
-
Warum nicht einfach ein
template <typename T> const T operator+(T const& lhs, T const& rhs) { T res(lhs); res += rhs; return res; }
Jetzt muß jede Klasse nur noch ein op+= mitbringen. Und es geht ohne gemeinsame Basisklasse, somit sind auch keine virtuellen Funktionen nötig und das ganze ist schön flott. Mußt den op+ nur in irgendeinen namespace packen, sonst könnte es zu Konflikten kommen.
MfG Jester
-
das hab ich mir auch schon gedacht und vor 4 min implementiert.
wie ruf ich das dann aber auf?z0, z2, z2 sind Bruch*
*z0 = *z1 + *z2; wohin das <Bruch> ?
ich hab sowas noch nie gemacht ...
-
das <Bruch> mußt Du garnicht angeben, weil der Compiler sich das herleiten kann.
-
interpreter schrieb:
Und du hättest eigentlich bereits beim 1. Mal meines Postings merken können, dass das rhetorische Fragen waren.
Wenn jemand so eine Klasse schreibt:
und jemand fragt, warum name public ist, dann will man nicht wissen, WARUM er das so macht sondern ihn darauf hinweisen, dass es schlecht ist.Es gibt sicher gute Gründe warum ein Member public sein sollte, deshalb sind rhetorische Fragen solcher Art meistens mehrdeutig, genau wie deine...
-
das geht sogar
find ich zwar nicht wirklich schön aber was solls.
-
Was ist daran nicht schön?
Willst Du etwa immer nochmal dazuschreiben welchen Typ die beiden Operanden haben? Und wenn Du die Zahl-Klasse durch ne andere ersetzt an jedem Operator die Typen mitändern?