Aber was mache ich,
wenn es keinen integer gibt, auf dem man verweisen könnte?
…
von Delphi kenne ich das als Properties.
die dann mit read und write definiert werden.
Gibts das auch bei C++ ?
Nee, dieses nette Delphi-Feature gibt’s in C++ leider nicht. Das Beispiel, das ich Dir geschickt hatte, funktioniert ja auch nur deshalb, weil eine int-Referenz zurückgegeben wird, die wahlweise einen Wert liefern oder als Ziel einer Zuweisung dienen kann. C++ kennt nur „data members“ und „member functions“, aber keine Möglichkeit, den Zugriff auf Data Members zu kapseln.
Microsoft simuliert das bei ActiveX(bzw. COM)-Objekten. Dort kannst Du Properties deklarieren, für die Put_XXX_- und Get_XXX_-Methoden implementiert werden können. Unter Visual Basic z.B. siehst Du die Eigenschaft dann wie eine Membervariable, beim Lesen und Schreiben werden jedoch die entsprechenden Methoden aufgerufen.
Für das, was Du haben willst, benötigst Du in C++ auf jeden Fall zwei Methoden.
Dein Problem ist eigentlich, dass du nicht nur den Operator [] überladen willst, sondern sogar zwischen lesen und schreiben unterscheiden möchtest. Dies ist selbstverständlich auch in C++ möglich, aber nicht ganz offensichtlich. Ich mach’s mal an einem Beispiel klar:
//Dieser Typ ist Rückgabetyp von []
//
typedef int tValue;
//
//Deine Klasse
//
class X
{ ...
//Für konstante X-objekte gibt's nur Lesezugriff:
tValue operator [] (long index) const
{ //Implementierung
}
//
//Für nicht-konstante X-Objekte geben wir ein Objekt der
//folgenden Klasse Y zurück:
class Y
{ class X &m\_rX; //Referenz auf Objekt von X
long m\_Index; //Index vom [] operator
//
//Constructor muss mit Initialisierung arbeiten, da
//eine Zuweisung an eine Referenz verboten ist!
Y( X &rhs, long index ) : m\_rX(rhs), m\_Index(index) { };
//
//Lesezugriff (automatischer type cast in tValue):
operator tValue ()
{ //Benutze m\_rX und m\_Index zur Berechnung
};
//
//Schreibzugriff (Überladung von Operator =
Y& operator = ( ... )
{ //Benutze m\_rX und m\_Index nach Herzenslust :smile:
return \*this;
}
//
//Problem: Theoretisch Zuweisung eines Y-Objekts möglich:
Y& operator = ( const Y& rhs )
{ //Benutze rhs.m\_rX und rhs.m\_Index zur Berechnung.
return \*this;
}
};
...
};