Vorstellung Fraction Klasse
-
Hmm, wieso sind denn die Operatoren für den Float-Typen überladen? Wäre int das nicht sinnvoller?
-
warum diese deutsch englich mischung?
-
@Badestrand
Klasse danke für Deine Meinung, ich werde mich gleich ransetzen und das mit einfügen.
@stammleser
--.-- da hast du natürlich recht. Werde ich auch sofort um umändern, danke für dein Beitrag.
@Tachyon
Logisch, was ich da wohl gedacht hatte
-
Bei den ganzen Operatoren muss du ne Referenz zurückgeben
-
Ach die Operatoren sind ja völlig im Arsch
-
klasse danke für dein Edit Badestrand, ich werde es mir zu Herzen nehmen.
P.S. Ich habe den Fehler geändert

-
ref schrieb:
Bei den ganzen Operatoren muss du ne Referenz zurückgeben
Wie kommst Du denn darauf? Das wäre tötlich.
-
Er hat das mit den Operatoren eh völlig falsch gemacht. Die verändern das Objekt ja gar nicht! Normalerweise gibt man *this zurück als Referenz.
-
soll ja auch so sein, ich will ja nicht das meine Stammobjekte die am anfang eingegeben werden geändert werden sollen

-
rofl
-
ref schrieb:
Er hat das mit den Operatoren eh völlig falsch gemacht. Die verändern das Objekt ja gar nicht! Normalerweise gibt man *this zurück als Referenz.
Ist alles gut.
Fraction a(1,2); Fraction b(1,3); Fraction c = a + b;Sollte danach a etwa auch 5/6 sein? Ich denke nicht.
-
hast recht
-
richtig genau das is der Punkt Tachyon. Genau wegen so einem Problem habe ich hier nämlich shconmal im Forum angefragt

-
Die Rückgabe einer Referenz kommt natürlich bei den bereits vorhandenen Operatoren nicht in Frage. Es fehlen auch noch ein paar, einige wurden schon genannt, ich führe nochmal auf
unär: + -
binär: == != < > <= >= += -= *= /=
Eine einfache Konvertierung aus int wäre wünschenswert, es ist relativ natürlich zu schreiben:Fraction x = 1;Sinnvoll würde man hier wohl mit Defaultargumenten arbeiten - insofern halte ich den jetzigen Defaultkonstruktor nicht für günstig, weil er keine Initialisierung durchführt (das kann nat. auch Absicht sein). Für günstiger halte ich
Fraction(int zaehler=0,int nenner=1);aber man kann das diskutieren.
ggT hat nichts mit einer konkreten Instanz von Fraction zu tun, und sollte folglich wenigstens static sein - tatsächlich hat es nicht mal entfernt etwas mit Fraction zu tun - eine freie Funktion ist hier weitaus sinnvoller. Das Problem mit der Interaktion mit float wurde schon angesprochen - das kann man machen, aber da float nicht exakt ist, kann das Ergebnis auch nicht exakt sein, und sollte folglich float sein (analog double, long double). Schließlich erlauben diese Operatoren float-Argumente nur für den rechten Operanden, das ist unintuitiv - die Benutzung von freien Operatoren ist hier absolut angebracht.Ob die Streamoperatoren dagegen in der Klasse (+friend) definiert werden, oder erst außerhalb (und möglicherweise nicht friend) ist dagegen absolut und völlig egal. Für den Benutzer spielt es keine Rolle, und auch an der Implementation ändert sich nichts und eine 3. interessierte Partei existiert nicht. Der Kommentar darüber ist allerdings falsch! Was sollen die denn sonst sein, wenn nicht überladene Operatoren?!?
-
Ui, den unären Operator '+' kannte ich gar nicht - sollte der einfach "leer" implementiert werden?
-
ok super danke camper, ich werde deine Hinweise beherzigen und es versuchen soweit umzuschreiben. Ist es denn auch ok wenn ich soviele MEthoden nur für die Operatoren machen? Also ist das bei solchen Klassen normal?
EDIT: Genau was meinst du mit den unären + -
-
Firefighter schrieb:
EDIT: Genau was meinst du mit den unären + -
Für positive und negative Zahlen.
Fraction a(1,2); Fraction b = -a;
-
ach du scheiße, daran habe ich ja gar nicht gedacht, stimmt sowas müsste ich noch einfügen. Mal eine Frage wie müsste ich denn += Operator für 2 FRaction objekte bauen?
-
Badestrand schrieb:
Ui, den unären Operator '+' kannte ich gar nicht - sollte der einfach "leer" implementiert werden?
Er sollte den Wert der Zahl zurückgeben (also keine Referenz, wie man versucht sein könnte). Natürlich macht er nichts interessantes.
Unäre Operatoren sind solche, die nur einen Operanden haben. Wir möchten z.B. Schreiben:
Fraction x = ... x = -x; // unäres Minus x = +x; // unäres Plus - macht im Prinzip gar nichts, existiert der Systematik wegen
-
Firefighter schrieb:
Mal eine Frage wie müsste ich denn += Operator für 2 FRaction objekte bauen?
So evtl.:
Fraction& operator+=(const Fraction& right) { m_numerator = m_numerator * right.m_denominator + right.m_numerator * m_denominator; m_denominator = m_denominator * right.m_denominator; return *this; }Edit: Das const vor der zurückgegebenen Referenz war mist.