Forum: Compiler & IDEs Unbekannte Operartor-Überladung


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich arbeite gerade das Buch "Moderne C++ Programmierung" durch. In einem 
Beispiel ist eine Operatorüberladung zu sehen, die ich nicht verstehe. 
Es wird nicht erklärt wozu sie gut ist.
Diese Operatorüberladung ist als Methode in einer Klasse realisiert.
1
operator unsigned int () const {return actual;}

Wozu dient diese Opeatorüberladung bzw. welcher Operator wird hier 
überladen?
Ich danke euch im Voraus.

Schöne Grüße

Martin

von Sven P. (Gast)


Lesenswert?

Es wird der Cast-Operator überladen, und zwar der Cast nach 'unsigned 
int'.

von Martin (Gast)


Lesenswert?

Es geht um einen Ringbuffer. Ich weiß nicht, ob ich das ganze Beispiel 
hier öffentlich posten darf.

Ich verstehe nicht, warum der "unsigned int"-Operator in diesem Beispiel 
überladen wird und wann diese Überladung aufgerufen wird.

Darf ich hier dieses eine Beispiel öffentlich posten?

von Alex W. (Gast)


Lesenswert?

Ja darfst du

von Martin (Gast)


Lesenswert?

Na dann ;-)
1
#include <iostream>
2
3
class RingIndex
4
{
5
public:
6
explicit RingIndex(unsigned int s) : max(s), actual(0) {}
7
8
void inc()
9
{
10
if(actual == (max-1))
11
actual=0;
12
else
13
actual++;
14
}
15
16
RingIndex &operator++()
17
{
18
inc();
19
return *this;
20
}
21
22
RingIndex operator++(int)
23
{
24
RingIndex tmp(*this);
25
inc();
26
return tmp;
27
}
28
29
operator unsigned int () const {return actual;}
30
31
private:
32
unsigned int actual;
33
const unsigned int max;
34
};
35
36
37
38
int main()
39
{ using namespace std;
40
41
int array[3];
42
RingIndex r(3);
43
44
array[r++]=701;
45
array[r++]=702;
46
array[r++]=703;
47
48
cout << array[r++] << endl;
49
cout << array[r++] << endl;
50
cout << array[r++] << endl;
51
cout << array[r++] << endl;
52
cout << array[r++] << endl;
53
cout << array[r] << endl;
54
55
return 0;
56
}

Ausgabe des Programms:
1
701
2
702
3
703
4
701
5
702
6
703

Ich verstehe nicht, wann die "unsigned int"-Operatorüberladung zum Zuge 
kommt.
Was ich auch nicht verstehe, ist diese Zuweisung.
1
array[r++]=701;
Bei r++ wird im Prinzip die Methode mit dem ++-Operator aufgerufen. Was 
ich nicht verstehe ist, dass die überladene ++-Operator-Methode die 
Klasse zurückliefert und nicht einen Integerwert, der eigentlich für den 
Index des Feldes "array" nötig wäre. Wie kann das funktionieren?
Bzw. Was habe ich falsch verstanden ;-)  ?

von (prx) A. K. (prx)


Lesenswert?

Leerzeichen sind ungiftig.

von Rrolf Magnus (Gast)


Lesenswert?

Sven P. schrieb:
> Es wird der Cast-Operator überladen,

Konvertier-Operator.

Martin schrieb:
> Ich verstehe nicht, wann die "unsigned int"-Operatorüberladung zum Zuge
> kommt.
> Was ich auch nicht verstehe, ist diese Zuweisung.array[r++]=701;
> Bei r++ wird im Prinzip die Methode mit dem ++-Operator aufgerufen. Was
> ich nicht verstehe ist, dass die überladene ++-Operator-Methode die
> Klasse zurückliefert und nicht einen Integerwert, der eigentlich für den
> Index des Feldes "array" nötig wäre. Wie kann das funktionieren?

Die Antwort auf beide Fragen ergibt sich aus der Kombination beider. Der 
operator wird aufgerufen, wenn du irgendwo ein Objekt deiner Klasse 
einsetzt, wo ein unsigned int benötigt wird. De Wert, der da dann 
eingesetzt wird, wird über den Aufruf des Operators ermittelt.

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.