011
09.07.2003, 13:33 Uhr
~0xdeadbeef
Gast
|
Soweit, so gut. Zunächst mal: Normalerweise spaltet man eine Klasse in zwei Dateien auf - den Header, in dem die Klasse deklariert wird, und die cpp-Datei, in der die Methoden implementiert werden. Wenn dus ander machst, kriegst du bei größeren Programmen Probleme mit dem Linker, weil er dieselbe Methode mehrmals findet und nicht weiß, welche er nehmen soll.
Der Aufbau der Klasse sieht soweit nicht schlecht aus, bis auf eine kleine Ungereimtheit und drei Sachen, die fehlen. Also:
C++: |
//bruch.h #ifndef BRUCH_H //für den Fall, dass der Header in einer Datei zweimal included wird #define BRUCH_H
#include <iostream>
using namespace std;
class Bruch { private: int x; int y; public: Bruch(void); Bruch(int z,int n);
~Bruch(); Bruch operator*(Bruch &) const; //keine Referenz zurückgeben.
int zaehler() const; //man muss ja von außen auf die Werte zugreifen können. int nenner() const; };
ostream &operator<<(ostream&, Bruch); //für die Ausgabe
#endif
|
Der operator* ist kein Zuweisungsoperator, *this wird nicht verändert. (Darum hab ich ihn auch const deklariert) Dementsprechend hast du auch kein Objekt, dass du als Referenz zurückgeben könntest und musst ein neues erstellen. Der Operator << ist dazu da, dass du nachher
C++: |
Bruch b(2,5); cout << b << endl;
|
schreiben kannst. Jetzt die cpp. Der Operator* ist Blödsinn, der Rest sieht OK aus. Allerdings würde ich die Konstruktoren ein bisschen anders schreiben:
C++: |
//bruch.cpp #include <iostream> //eigentlich nicht mehr nötig, aber übersichtlicher #include "bruch.h" //hier steht nämlich #include <iostream> schon drin
using namespace std; //siehe #include <iostream>
Bruch::Bruch(void) : x(1), y(1) { } Bruch::Bruch(int z,int n) : x(z), y(n) {}
Bruch::~Bruch(){}
int Bruch::zaehler() const { return x; } int Bruch::nenner() const { return y; }
/* Ich erstelle ein neues Bruch-Objekt, dass mit den Ergebniswerten der * Multiplikation initialisiert wird. Das gebe ich dann zurück. */ Bruch Bruch::operator*(Bruch &c) const { return Bruch(x*c.zaehler(), y*c.nenner()); }
/* Den Bruch in Einzelteilen in den Stream schreiben. */ ostream &operator<<(ostream &os, Bruch b) { os << b.zaehler() << '/' << b.nenner(); return os; }
|
Alles klar? edit by FloSoft: ebenfalls Smiley-Fehler rausgemacht Dieser Post wurde am 09.07.2003 um 15:20 Uhr von FloSoft editiert. |