Lektion 53:Die Klasse RationalDie Klasse Rational stellt Bruchzahlen dar. Der erste Ansatz sieht so aus:
Jetzt würde ich zu gerne im Konstruktor schreiben:
Das geht leider nicht. Ich muß irgendwie unterscheiden, welche Variable zaehler ich eigentlich meine. Dazu nenne ich eine um (schweren Herzens). Ich entscheide mich, die Attribute mit "m_" beginnen zu lassen (dabei steht das m für member).
Wir wollen die Bruchzahlen immer in gekürzter Form vorliegen haben. Um einen Bruch zu kürzen, teilt man Zähler und Nenner durch den größten gemeinsamen Teiler. Da Brüche immer nur in der gekürzten Form vorliegen sollen, ist die Methode kuerzen() für alles außerhalb der Klasse nicht von Interesse. Darum wird diese Methode in die private-Sektion geschrieben.
Und schon wieder ein Fehler! Die Variable ggt verdeckt die Funktion ggt. Das macht normalerweise nichts, aber hier geht das nicht, weil ich die Funktion ggt brauche. Also nenne ich die Variable ggt um.
Bis jetzt sieht das Programm so aus:
Soweit funktioniert die Klasse Rational. Richtig interessant wird es aber erst, wenn man diese Klasse auch zum Rechnen benutzen kann. Es müssen also Methoden geschrieben werden, die für die arithmetischen Operatoren (+,-,* und /) zuständig sind.
Die main-Funktion kann jetzt um die folgenden Zeilen erweitert werden:
In der Methode multipliziereDichMit sind zwei Objekte der Klasse Rational verfügbar:
In der Zeile
wird ein neues Objekt der Klasse Rational erzeugt. Dieses Objekt soll das Ergebnis der Rechnung sein. Zum Erzeugen dieses neuen Objekts wird der Konstruktor der Klasse Rational aufgerufen. Das ist sehr praktisch, weil in diesem Konstruktor auch gleich die kuerzen-Methode aufgerufen wird. Mit
wird das gerade neu erzeugte Objekt zurückgegeben. Im Funktionskopf dieser Methode steht ja vor multipliziereDichMit der Typ Rational. Diese Methode gibt also Objekte vom Typ Rational zurück. Genau, wie es sein soll. Doch leider ist das Rechnen mit solchen unhandlichen Funktionen unangenehm. Viel angenehmer wäre es doch, wenn man in der main-Funktion
schreiben könnte. Und das geht sogar! Dazu werden die arithmetischen Operatoren überladen. In C++ kann man nämlich Funktionen schreiben, die aufgerufen werden, wenn ein Operator verwendet werden soll. Wie die Methode zu funktionieren hat, ist klar, denn die Implementierung ist natürlich die der multipliziereDichMit-Methode. Nur der Name ist etwas besonderes. Hier ist das Syntax-Highlighting etwas verwirrend. Sehen Sie "operator*" als ein Wort an.
Der Name operator* ist ganz speziell dafür reserviert, den Operator * zu überladen. Wenn dies geschehen ist, dann macht der Compiler automatisch aus dem Ausdruck
den Ausdruck
und dieser Ausdruck unterscheidet sich in nichts (außer dem Namen) von einem ganz normalen Funktionsaufruf wie
Ab jetzt kann man mit der neuen Klasse Rational angenehm arbeiten.
Natürlich wäre es genauso möglich, weitere Operatoren zu überladen. Sie müssen sich nur vorstellen, ganz normale Methoden zu schreiben, die eben den besonderen Namen haben und darum auch auf besondere Weise aufgerufen werden dürfen. Einsendungen:Was bedeutet rhs?Übung:Vervollständigen Sie die Klasse Rational so, daß sie auch die Operatoren +, -, und / hat. Einsendungen:LösungsvorschlagFalls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern. [aktuelle Version] [inhalt] [index] [Fehlerkorrektur, Verbesserungsvorschlag] © Volkard Henkel <volkard@normannia.de>, last update: 08/25/00 |