Operatorenüberladung

OP (Firma: ..) #2921876
Lesenswert?

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
OP (Firma: ..) #2921953
Lesenswert?

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
}
#2921973
Lesenswert?

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.
Moderator #2922039
Lesenswert?

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 ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren