Hallo Leute,
Ich möchte die Operatoren für [] und = so überladen, daß der Code
in der main() so stehen bleiben kann (Kurzfassung):
#include
using namespace std;
class Box
{
public:
Box() : i(0) {}
~Box() {}
Box& operator= (int num);
// for writing, will be left hand:
Box& operator[] (int index);
// for reading, will be right hand:
int operator[] (int index) const;
private:
int i;
int array[10];
};
Box& Box::operator= (int num)
{
array[i] = num;
return \*this;
}
// writing
Box& Box::operator[] (int index)
{
i = index;
return \*this;
}
// reading
int Box::operator[] (int index) const
{
return array[index % 10];
}
int main()
{
Box b;
b[0] = 123;
b[1] = 456;
// error: `class Box' used where a `int' was expected
int get0 = (int)b[0];
int get1 = (int)b[1];
cout Ich denke, der op= ist das Problem: zu Beginn passt er genau, aber zum
Lesen ist er nicht geeignet, da er links eine "Box &" verlangt.
Ich kann aber den op= nicht für zwei int's
überladen, da dieser nur in einer Klasse zulässig ist.
Ich könnte mir natürlich anders behelfen. Mich würde
nun aber interessieren, ob das mit den op[] hinzukriegen ist.
Hat jemand eine Lösung?
lg
Martin B
Hallo Leute,
Ich möchte die Operatoren für [] und = so überladen, daß der
Code
in der main() so stehen bleiben kann
(Kurzfassung):
#include
using namespace std;
…
Ich kann aber den op= nicht für zwei int’s
überladen, da dieser nur in einer Klasse zulässig ist.
Ich könnte mir natürlich anders behelfen. Mich würde
nun aber interessieren, ob das mit den op[] hinzukriegen ist.
Hat jemand eine Lösung?
Du hast ja nicht direkt „für zwei int’s überladen“,
der eine bezieht sich auf ein const-Objekt, der
andere nicht.
Ein Simples „ver_const_en“ würde daher reichen:
...
const Box &rb = b;
int get0 = **r** b[0];
int get1 = **r** b[1];
...
Nun kann nur int operator[] (int index) const;
gefunden werden.
Allerdings weiß ich nicht, was die Überladung
von [] mit Box& als Rückgabe bringen soll.
Das ist ziemlich verwirrend. Die Lösung wäre
hier m.E. ein sauberes Interface wie b.set(0, 123)
und nicht so ein Kuddelmuddel 
Du kannst natürlich auch zwei verschiedene
Operatoren für lesen und Schreiben überladen,
also z.B. so:
...
class Box {
int i, array[10];
public:
Box() : i(0) {}
~Box() {}
Box& operator = (int num);
Box& operator () (int index); // for writing, will be left hand:
int operator [] (int index) const; // for reading, will be right hand:
};
Box& Box::operator= (int num) {
array[i] = num;
return \*this;
}
Box& Box::operator() (int index) { // writing
i = index;
return \*this;
}
int Box::operator[] (int index) const { // reading
return array[index % 10];
}
int main()
{
Box b;
b(0) = 123;
b(1) = 456;
int get0 = b[0];
int get1 = b[1];
...
Grüße
CMБ
Hallo Semjon
Ein Simples „ver_const_en“ würde daher reichen::
const Box &rb = b;
int get0 = r b[0];
int get1 = r b[1];
Nun kann nur int operator[] (int index) const;
gefunden werden.
Leuchtet mir ein, darauf wäre ich nicht gekommen…
Allerdings weiß ich nicht, was die Überladung
von [] mit Box& als Rückgabe bringen soll.
Das musste sein, damit ich in der main() das hier schreiben kann, zum Setzen des Index’ und damit das links stehen kann:
Box b;
b[0] = 123;
und das nimmt er ja.
Das ist ziemlich verwirrend. Die Lösung wäre
hier m.E. ein sauberes Interface wie b.set(0, 123)
und nicht so ein Kuddelmuddel 
Das war auch mehr als „Sport“ gemeint. Es ging mir darum, die Schreibweise von C-Arrays zu ermöglichen. Dein Beispiel ist schon eine sehr gute Lösung.
Danke für die Tips, habe ich mir kopiert!
do svidanje
Martin B
Hallo Martin,
Allerdings weiß ich nicht, was die Überladung
von [] mit Box& als Rückgabe bringen soll.
Das musste sein, damit ich in der main() das hier schreiben
kann, zum Setzen des Index’ und damit das links stehen
kann:
Box b;
b[0] = 123;
und das nimmt er ja.
…
Das war auch mehr als „Sport“ gemeint. Es ging mir darum, die
Schreibweise von C-Arrays zu ermöglichen.
OK, trotzdem hab ich Deine Intention noch nicht ganz
kopiert. Warum willst Du, wenn Du einen ‚int‘ verändern
oder auslesen willst, dennoch ein Box& zurückgeben.
Warum nicht gleich den Typ, den Du haben willst?
Etwa so:
...
class Box {
int i; // keeps the last accessed index
int array[10];
public:
Box() : i(0) {}
int& operator [] (int index); // for reading/writing
};
int& Box::operator [] (int index) {
i = index % sizeof(array);
return array[i];
}
int main()
{
Box b;
b[0] = 123, b[1] = 456;
int get0 = b[0], get1 = b[1];
...
Grüße
CMБ
Hallo Semjon,
Jetzt bin ich aber richtig platt…! Darauf wäre ich erst recht nicht gekommen. Ein echter Profi macht halt das Gleiche mit halb so viel Zeilen, :-]. Die Rückgabe „int&“ führt nun dazu, daß das Objekt auch links stehen kann, sehe ich ein.
Spasibo
bis bald
Martin B