Guten Tag, gerade lese ich mich durch ein C++ Skript und bin bei den Überladungen angelangt. Leider ist das Skript nur sehr bescheiden ausgeführt und mehr eine Sammlung von Präsentationsfolien. Vielleicht könnt ihr mir ja weiterhelfen. Es geh um folgendes : Ich möchte gerne in C++ die Operatoren + sowie << und >> für cout und cin überladen. Aus dem Skript habe ich folgendes gelernt : friend ErgebnisTyp operator + ( Parameter ) Bei mir wäre das dann friend RationaleZahl & operator + (RationaleZahl &r1 , RationaleZahl &r2) Ich habe es bisher immer so gemacht, dass ich bei den Parametern und beim Ergebnisstyp ein & dazugeschrieben habe. In späteren Kapiteln des Skripts wird aber oftmals das & weggelassen. Ist es richtig, dass ich es für den Zugriff auf private Attribute benötige ? Und ist es falsch, wenn ich es immer hinschreibe ? Im Skript habe ich zum Beispiel folgendes Beispiel : friend RationaleZahl operator + (RationaleZahl , RationaleZahl) und friend ostream & operator << (ostream &os , RationaleZahl r) Darf ich das Ganze auch immer so schreiben : friend RationaleZahl & operator + (RationaleZahl &r1 , RationaleZahl &r2) und friend ostream & operator << (ostream &os , RationaleZahl &r) oder wäre das in bestimmten Fällen falsch ?
D43C schrieb: > Ist es richtig, dass ich es für den Zugriff auf private Attribute > benötige ? Nein. > Und ist es falsch, wenn ich es immer hinschreibe ? Du solltest vor den Überladungen erstmal lernen, was Referenzen sind (die Dinger mit &), warum man sie einsetzt, und wann sie sinnvoll sind. Das können die drei Zeilen in einem Webforum nicht abnehmen. Also ---> Buch.
D43C schrieb: > Ich habe es bisher immer so gemacht, dass ich bei den Parametern und > beim Ergebnisstyp ein & dazugeschrieben habe. > In späteren Kapiteln des Skripts wird aber oftmals das & weggelassen. > > Ist es richtig, dass ich es für den Zugriff auf private Attribute > benötige ? Nein. > Und ist es falsch, wenn ich es immer hinschreibe ? Ja. > Darf ich das Ganze auch immer so schreiben : > > friend RationaleZahl & operator + (RationaleZahl &r1 , RationaleZahl > &r2) > > und > > friend ostream & operator << (ostream &os , RationaleZahl &r) oder > wäre das in bestimmten Fällen falsch ? Es wäre falsch.
Schau Dir doch mal im C++ Compiler Deiner Wahl die Implementierung der Klasse <complex> an. Auf Unix Systemen findest Du die normalerweise irgendwo unter /usr/include/c++. Dort kannst Du Dir viel abschauen hinsichtlich dessen, wie man so etwas implementiert. Auch boost.org hat meines Wissens bereits Bibliothek für rationale Zahlen. Selbst wenn Du die aus welchen Gründen auch immer nicht verwenden willst, als Vorlage ist sie sicherlich nicht verkehrt. In diesem Fall wirst Du mit ziemlicher Sicherheit die kanonische Form wollen, d.h. Du implementierst ein += Operator, der als member-Fumktion Zugriff auf alle privaten Daten hat und die eigentliche Arbeit erledigt. Der (oder besser die) + Operatoren werden dann mit dessen Hilfe implementiert.
1 | inline RationaleZahl operator+(const RationaleZahl& x, const RationaleZahl& y) { |
2 | RationaleZahl tmp = x; |
3 | tmp += y; |
4 | return tmp; |
5 | }
|
Achte auf const& für die Parameter und als return-Typ wirst Du einen value-Typ wollen. Mehrere Operatoren bieten sich an, um auch Operationen mit dem Basistyp Deiner Klasse zuzulassen. z.B:
1 | inline RationaleZahl operator+(const RationaleZahl& x, int y) { |
2 | RationaleZahl tmp = x; |
3 | tmp += RationaleZahl(y); // sofern kein RationaleZahl& operator+=(int) existiert |
4 | return tmp; |
5 | }
|
D43C schrieb: > gerade lese ich mich durch ein C++ Skript Wenn das Skript solche Fragen aufkommen lässt, dann sind dringend folgende 4 Aktionen auszuführen: 1) Mülleimer auf 2) Skript rein 3) Mülleimer zu 4) Gutes C++ Buch besorgen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.