hallo. kennt jemand eine seite oder ein buch zur operatorenüberladung? am besten wo es gut, einfach und verständlich erklärt wird? speziell die stream operatoren >> und << finde da im netz nichts passendes zu. oder kann mir das hier jemand kurz verdeutlichen`? danke
google: "c operator überladen <<" Suchmaschinen sollten eigentlich allgemein bekannt sein.
ist cpp und ja ich kenne google. allerdings kommt da nichts brauchbares, vorallem nicht zum streamoperator
was genau willst du denn wissen? Operatorüberladung ist in der Regel nichts weiter als eine Methode mit einem vorgegebenen Prototypen, die im Programm mit einfacher Syntax aufgerufen werden kann.
sry aber ich checke die Frage dann überhaupt nicht. Geht es jetzt ums Überladen der um die Grundlagen von Streamoperator.
es geht um zb sowas:
1 | class Ratio |
2 | { ... |
3 | public:
|
4 | ...
|
5 | int getZaehler() const {return zaehler;} |
6 | int getNenner() const {return nenner;} |
7 | ...
|
8 | } ; |
9 | ostream& operator<< (ostream& os, const Ratio& r) { |
10 | os << "(" << r.getZaehler() << "/" << r.getNenner() << ")"; |
11 | return os; //Ergebnis ist der Output-Stream zur weiteren Nutzung |
12 | }
|
13 | istream& operator>> (istream& is, Ratio& r) |
14 | { int z,n; |
15 | cout << "Zaehler: " ; is >> z; |
16 | cout << "Nenner: " ; is >> n; |
17 | r = Ratio(z,n); |
18 | r.kuerze(); |
19 | return is; //Ergebnis ist der Input-Stream zur weiteren Nutzung |
20 | }
|
frage ist: wozu braucht man das, bzw was kann man damit machen? und was macht der programmausschnitt?
Carolin .. schrieb: > frage ist: > > wozu braucht man das, bzw was kann man damit machen? > und was macht der programmausschnitt? Na, ja. Wenn du ein Ratio Objekt hast
1 | int main() |
2 | {
|
3 | Ratio dieZahl; |
4 | }
|
dann möchtest du die ja auch mal irgendwo ausgeben lassen ...
1 | int main() |
2 | {
|
3 | Ratio dieZahl; |
4 | |
5 | std::cout << dieZahl; |
6 | }
|
... so wie du auch andere Dinge ausgeben lässt. Und dann kommt eben der
Operator ins Spiel, in dem festgelegt ist, was denn dieses << im
Zusammenhang mit einem Ratio Objekt eigentlich tun soll.
> und was macht der programmausschnitt?
Lies halt den Code.
Jeder der in der ersten Stunde C++ aufgepasst hat ...
1 | int main() |
2 | {
|
3 | std::cout << "Hello world\n"; |
4 | |
5 | int i = 8; |
6 | std::cout << i << "\n"; |
7 | }
|
sollte eigentlich wissen, was in
1 | ostream& operator<< (ostream& os, const Ratio& r) |
2 | {
|
3 | os << "(" << r.getZaehler() << "/" << r.getNenner() << ")"; |
4 | |
5 | return os; //Ergebnis ist der Output-Stream zur weiteren Nutzung |
6 | }
|
passiert. Nur weil die ganze Funktion irgendwas mit 'operator' heisst, funktioniert ja die Ausgabe auf einem stream auch nicht anders. In der ersten Stunde C++ hast du halt auf ein bereits fertiges stream Objekt, den std::cout, ausgegeben und hier kriegt die Funktion den Stream dann eben als Parameter mitübergeben. Aber stream ist stream, und auf den gibt man mit << aus.
Das Ziel der ganzen Aktion ist es, die Klasse Ratio folgendemaßen verwenden zu können:
1 | #include <iostream> |
2 | |
3 | using namespace std; |
4 | |
5 | int main() { |
6 | Ratio bruch; |
7 | |
8 | cout << "Bitte einen Bruch in der Form eingeben:" << endl; |
9 | cin >> bruch; |
10 | cout << "Der gekürzte Bruch ist " << bruch << endl; |
11 | |
12 | return 0; |
13 | }
|
Ich habe hier mal die fehlenden Teile der Klasse ausgefüllt, damit ein ablauffähiges Programm entsteht:
1 | #include <iostream> |
2 | |
3 | using namespace std; |
4 | |
5 | class Ratio { |
6 | public:
|
7 | Ratio(int z=1, int n=1) { |
8 | zaehler = z; |
9 | nenner = n; |
10 | }
|
11 | |
12 | int getZaehler() const { return zaehler; } |
13 | |
14 | int getNenner() const { return nenner; } |
15 | |
16 | void kuerze() { |
17 | int a=abs(zaehler), b=abs(nenner), tmp; |
18 | |
19 | while(b) { |
20 | tmp = a % b; |
21 | a = b; |
22 | b = tmp; |
23 | }
|
24 | zaehler /= a; |
25 | nenner /= a; |
26 | |
27 | if(nenner < 0) { |
28 | zaehler = -zaehler; |
29 | nenner = -nenner; |
30 | }
|
31 | }
|
32 | |
33 | private:
|
34 | int zaehler, nenner; |
35 | };
|
36 | |
37 | ostream& operator<< (ostream& os, const Ratio& r) { |
38 | os << "(" << r.getZaehler() << "/" << r.getNenner() << ")"; |
39 | return os; //Ergebnis ist der Output-Stream zur weiteren Nutzung |
40 | }
|
41 | |
42 | istream& operator>> (istream& is, Ratio& r) { |
43 | int z,n; |
44 | |
45 | cout << "Zaehler: " ; is >> z; |
46 | cout << "Nenner: " ; is >> n; |
47 | r = Ratio(z,n); |
48 | r.kuerze(); |
49 | return is; //Ergebnis ist der Input-Stream zur weiteren Nutzung |
50 | }
|
51 | |
52 | int main() { |
53 | Ratio bruch; |
54 | |
55 | cout << "Bitte einen Bruch in der Form eingeben:" << endl; |
56 | cin >> bruch; |
57 | cout << "Der gekürzte Bruch ist " << bruch << endl; |
58 | |
59 | return 0; |
60 | }
|
Die couts in der Funktion operator>> sind übrigens Unfug. Stell dir vor, die Brüche würden nicht von cin, sondern zu Tausenden aus einer Datei gelesen ...
kurze frage noch.. was macht das "abs" int a=abs(zaehler), b=abs(nenner), tmp; ?
Carolin .. schrieb: > kurze frage noch.. > was macht das "abs" Ja, du hast recht, die abse sind hier überflüssig.
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.