operator's [] und =

Von: , Frage gestellt am So, 27. Jan 2008

Hallo Leute,

Ich möchte die Operatoren für [] und = so überladen, daß der Code
in der main() so stehen bleiben kann (Kurzfassung):

#include <iostream>
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 << "get0 = " << get0 << "\n"
<< "get1 = " << get1 << "\n";
system ("pause");
return 0;
}
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

4 Antworten zu dieser Frage

  1. Antwort von nach 2 Stunden 0 hilfreich
    Re: 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 <iostream>
    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 "verconsten" würde daher reichen:
    ...
    const Box &rb = b;
    int get0 = rb[ 0 ];
    int get1 = rb[ 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Б

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: operator's [] und =

      Hallo Semjon Ein Simples "verconsten" würde daher reichen::

      const Box &rb = b;
      int get0 = rb[ 0 ];
      int get1 = rb[ 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

      • Antwort von nach einem Tag 0 hilfreich
        Re^3: operator's [] und =

        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Б

        • Antwort von nach 3 Tagen 0 hilfreich
          Re^4: na wusch

          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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!