operator[] Frage
-
Hallo, ich habe eine einfache Frage, finde die Antwort aber nirgends.
Ich habe eine eigene Klasse myString und überlade operator[] mit
char& operator[](unsigned int index); const char& operator[](unsigned int index) const;(Das ist identisch zu http://www.cppreference.com/cppvector/container_operators.html)
Im Hauptptogramm greife ich wie folgt drauf zu:
myString test("hello"); test[0]='c'; printf("%c\n", test[0]);Meine Frage ist, warum in beiden Fällen nur die erste Funktion von operator[] aufgerufen wird. Gibt es einen Weg Zuweisung und Rückgabewert zu trennen?
Wenn nein, muß mir noch jemand den Sinn dieser Überladung in der Vektor-Klasse erzählen.

Gruß, Dee
-
Der Compiler sucht die benätigte Funktion nach dem Status des Objekts aus. Falls dieses const ist, wird die const-Version verwendet, sonst die nicht-const-Version. Versuche mal das hier:
myString test("hello"); test[0]='c'; const MyString &temp = myString; printf("%c\n", temp[0]);Jetzt wird im printf die const-Version des Operators verwendet.
Stefan.
-
Meine Frage ist, warum in beiden Fällen nur die erste Funktion von operator[] aufgerufen wird.
Die Auswahl erfolgt anhand des Typs deines verwendeten Objekts - für 'myString' verwendet er den oberen, für 'const myString' den unteren Operator.
Gibt es einen Weg Zuweisung und Rückgabewert zu trennen?
An dieser Stelle nicht, aber du könntest einen Proxy dazwischenschalten und diese Unterscheidung aufschieben:
c_proxy operator[](int p) {return c_proxy(this,p);} char operator[](int p) const {return data[p];} class c_proxy { myString* who; int where; c_proxy(myString* s,int p) : who(s),where(p) {} friend class myString; public: c_proxy& operator=(char c);//schreiben operator char();//lesen };
-
Ah, dann habe ich die zweite Funktion also immer mißverstanden... Dann danke für die Aufklärung!

Werde mir überlegen, ob ich das mit dem Proxy mache, oder einfach ne neue Funktion Get(), bei der man dann sicher weiß, daß das zurückgegebene Objekt nicht mehr veränderbar ist.

Ich habe nämlich die Befürchtung, daß dieser operator[] nicht das macht, was ich will. (Er macht blöderweise auch nur das, was ich ihm sage.
)Gruß, Dee