Klassenoperator []

Hi.
Ich möchte auf Daten einer Klasse X mittels [] Operator zugreifen.
Ich habe Funktionen wie z.B.

signed int X::GetValue(unsigned long Position) {
 ...rechnen...
 return erbgenis;
}

und

void X::SetValue(unsigned long Position, signed int Value) {
 ..rechnen...
}

Bequemer ist es aber, mit [unsigned long] wie auf ein array zuzugreifen.
Das Lesen hab ich irgendwie hinbekommen, aber nicht die Zuweisung.

Hat jemand zufällig gerade ein Skelett dafür im Kopf ?

DANKE & GRUSS,
BERND

Hi.

Ho.

Meintest Du sowas?

class CSinnfrei
{
 int Var0;
 int Var1;
 int Var2;
 int Feld[3];
 int Sonstiges;

_// Wichtig: Operator muß **int&** liefern!_
 int& operator [] (unsigned int Index)
 {
 if (0 == Index)
 return Var0;
 else if (1 == Index)
 return Var1;
 else if (2 == Index)
 return Var2;
 else if (Index 
 /\*
 Jetzt ist:
 demo.Var0 = 0
 demo.Var1 = 1
 demo.Var2 = 2
 demo.Feld = {3,4,5}
 demo.Sonstiges = 9

 arr[0] = 0
 arr[1] = 1
 arr[2] = 2
 arr[3] = 3
 arr[4] = 4
 arr[5] = 5
 arr[6] = 9
 arr[7] = 9
 arr[8] = 9
 arr[9] = 9
 \*/

}

Gruß, Ralf

Hi.

Ho.

Hi.

Meintest Du sowas?

(fast) Genau, Danke!! Aber was mache ich,
wenn es keinen integer gibt, auf dem man verweisen könnte?

konkretes Beispiel für eine Zuweisung der Art:

double power = Class[100];
if (power \> 10.0) {
 Class[100] = 5.0;
}

Meine Klasse habe 2 double-array:

double \* re;
double \* im;

ein Lese-Zugriff sollte liefern:

// unsigned long index
return (re[index]\*re[index]+im[index]\*im[index]);

ein Schreibzugriff sollte ausführen:

// double value, unsigned long index
re[index] = value;
im[index] = value;

von Delphi kenne ich das als Properties.
die dann mit read und write definiert werden.
Gibts das auch bei C++ ?

Gruss,
Bernd

Hi.

Ho.

Hi.

Haihi-haiho.

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.

Gruss,
Ralf

nun,ja. wir sind mit c++ der maschine doch ganz schön nah.
trotzdem danke.

gruss,
bernd

Hi Bernd :smile:

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;
 }
 };
 ...
};

Ist C++ nicht ultra-geil :smile:

cu Stefan.

Hey. Sorry Stefan. Hab mir etwas Zeit gelassen.
Ich glaube ich habe verstanden, wie man das machen muss, bzw.
wie das in c++ geht.

Danke für Deine Mühe.
CU,
Bernd