Operator's [] und =

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 :wink:

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 :wink:

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