Forum: PC-Programmierung Operatorenüberladung


von Carolin .. (Firma: ..) (carolin88)


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

von ich (Gast)


Lesenswert?

google: "c operator überladen <<"

Suchmaschinen sollten eigentlich allgemein bekannt sein.

von Carolin .. (Firma: ..) (carolin88)


Lesenswert?

ist cpp
und ja ich kenne google.
allerdings kommt da nichts brauchbares, vorallem nicht  zum 
streamoperator

von Klaus T. (gauchi)


Lesenswert?

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.

von ich (Gast)


Lesenswert?

sry aber ich checke die Frage dann überhaupt nicht. Geht es jetzt ums 
Überladen der um die Grundlagen von Streamoperator.

von Carolin .. (Firma: ..) (carolin88)


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
}

von Carolin .. (Firma: ..) (carolin88)


Lesenswert?

frage ist:

wozu braucht man das, bzw was kann man damit machen?
und was macht der programmausschnitt?

von Karl H. (kbuchegg)


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.

von Yalu X. (yalu) (Moderator)


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

von Carolin .. (Firma: ..) (carolin88)


Lesenswert?

super, danke Yalu und karl heinz,
dass hat mir erstaml weitergeholfen.

von Carolin .. (Firma: ..) (carolin88)


Lesenswert?

kurze frage noch..
was macht das "abs"

      int a=abs(zaehler), b=abs(nenner), tmp;

?

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
Noch kein Account? Hier anmelden.