Seite 1 von 1

Implementierungschwierigkeiten einer Klassenmethode

Verfasst: 10. Oktober 2013 23:13
von Pauer
Hallo zusammen,
ich lerne gerade Qt, mithilfe des Buches An Introduction to Design Patterns in C++ with Qt (Prentice Hall Open Source Software Development), da dort die direkte Verbindung von c++ und qt beigebracht wird.
Außerdem hat es am Ende der Kapitel immer Übungen, so dass ich den Lerneffekt direkt messen kann.
Suboptimal ist, dass die Autoren bei den ersten Übungen keine Lösungen angeben. Dies ändert sich im Laufe des Buches, bzw. sind diese auf ihrer Internet Seite abrufbar. Allerdings nicht bei dem folgenden Problem, bei welchem ich nicht durchsteige.

Hier die Aufgabe:

Given the UML diagram in Figure 2.5 , define the class, and each member
function specified, for an enhanced Fraction class.


Bild

Write some client code to test all the new operations and verify that proper
calculations are done.

also die ersten drei Klassenmethoden stellt kein Problem dar (set, toString, toDouble). Allerdings bekomme ich die Klassenmethode add nicht hin (die folgenden auch nicht, aber die würden ja genauso gehen) bzw. weiß nicht genau, was diese genau darstellt (Konstruktor, ein Conversion oder was auch immer :wink: ).
Wenn ich so vorgehen will, wie in dem UML Diagramm dargestellt, schaff ich es nicht diese zu implementieren.
Weiterhin ist mir auch nicht klar, wie ich diese aufrufe, um das Ergebnis der Addition auf dem Bildschirm auszugeben.
Ich hoffe, jemand kann mir helfen :D
Wenn irgendwelche weitere Informationen gebraucht werden, stelle ich diese gerne zur Verfügung.
Schon mal vielen Dank.

Gruß
Patrick

Re: Implementierungschwierigkeiten einer Klassenmethode

Verfasst: 11. Oktober 2013 08:21
von Mr.Crank
Also wenn ich das UML Diagramm richtig verstanden habe, sollst du eine Klasse Bruch erstellen,
in welche ein Nenner und Zähler als int Member initialisiert werden soll.

Sprich es handelt sich um eine einfache mathematischen Aufgabe z.B add sollte wie folgt aussehen

Code: Alles auswählen

Fraction::Fraction& add (const Fraction& origFractA)
die Funktion gibt einen Klasse mit den geänderten Werten (in diesem Fall die eigene) zurück und bekommt
eine andere Klasse als unveränderbares Objekt zur Berechnung übergeben. Das & hinter dem Funktionsnamen
bitte nicht mit den direkten Zugriffsoperator verwechseln, es sagt nur aus das ein private Konstruktor für eine
Originalvorlage sorgt.

Deine add Methode ist also recht simple

Code: Alles auswählen

Fraction::Fraction& add (const Fraction& origFractA)
{
  //Überkreuzmethode ;)
  m_Numerator=m_Numerator*origFractA.m_Denominator+m_Denominator*origFractA.m_Numerator;
  m_Denominator=m_Denominator*origFractA.m_Denominator;
  return *this;
}
that´s about it dude

Gruß
Mr.Crank

Re: Implementierungschwierigkeiten einer Klassenmethode

Verfasst: 11. Oktober 2013 16:46
von Pauer
Hallo Mr. Crank,

vielen Dank für die Antwort, die qt SDK motzt nicht mehr :D .
Allerdings komme ich nicht klar, wie ich diese aufrufen soll, um die Addition zu überprüfen.
ich dachte an

Code: Alles auswählen

int main() {
    QTextStream cout(stdout);

    Fraction f1;
    f1.set(3, 4);
    
    cout << "\nDie Fraktion ist: " << f1.toString() << endl;
    cout << "Die Fraktion als double: " << f1.toDouble() << endl;
    cout << "Die Fraktion addiert: "  << f1.add() << endl;
}

was aber nicht klappt (auch verschiedene Werte in der Klammer haben nicht funktioniert).

Vielen Dank für die Hilfe.

Gruß
Patrick

Re: Implementierungschwierigkeiten einer Klassenmethode

Verfasst: 14. Oktober 2013 07:14
von Mr.Crank
Tach Patrick ,

sorry für das späte Antworten, falls es noch akut ist hier mal meine Überlegung nach
dem ersten Kaffee ;) was haut der Compiler denn für eine Meldung raus ? ;) (immer mit bei schreiben)
Wenn ich jetzt nach dem Wochenende noch alles richtig im Kopf habe,
musst du 2 Objekte erzeugen damit du überhaupt etwas zum addieren hast.

D.h.
Fraction f1,f2;
f1.set(1, 2);
f2.set(1, 2);

deine Addition war jetzt so ausgelegt das das original bzw. die eine Fraktion
mit den Werten der anderen bearbeitet wird. Also müsste dein Funktionsaufruf
wie folgt aussehen

Code: Alles auswählen

int main() {
    QTextStream cout(stdout);

    Fraction f1,f2;
    f1.set(1, 2);
    f2.set(1, 2);
    
    cout << "\nDie Fraktion ist: " << f1.toString() << endl;
    cout << "Die Fraktion als double: " << f1.toDouble() << endl;
    //Hier der Funktionsaufruf zur Addition von f1 mit f2
    f1.add(f2);
    //Jetzt müsste der der Wert von f1 verändert sein und hier 1 ergeben                                                                             
    cout << "Die Fraktion addiert mit  "  << f2.toDouble() <<"ergibt:"<<f1.toDouble()<< endl;
}
So sollte es klappen ;) geht auch in weniger Zeilen, aber für den Anfang ist es
so definitiv besser ;)

Gruß Mr.Crank