Operatoren überladen ([][])
-
FAQ.
-
Doch, dein Ansatz ist korrekt und die gängige Methode dieses Problem zu lösen.
Du kannst keine eigenen Operatoren ala [][] definiern sondern nur die vorgegeben verwenden -> eben op[].
Wo genau scheitert es denn bei dir? Dein op[] liefert ein Proxy Objekt dass selber einen op[] anbietet und dann den passenden int liefert.
am primitivsten wäre das zB so lösbar:
class Proxy { private: Array* obj; int x; public: Proxy(Array* obj, int x) : obj(obj), x(x) {} int& operator[](int y) { return obj->get(x,y); } };und Array würde im op[] dann einfach nur
return Proxy(this, x);machen.
primitive lösung die uU reicht

je nachdem was du mit dem proxy objekt noch alles machen willst.
alternativ wäre ein operator() möglich, wobei man hier halt eine andere syntax hat - das ist meist unpassend. und es gibt immernoch die möglichkeit eine methode get() anzubieten...
-
Hallo,
Danke schon mal für die Antworten!
Ich hab meinen Ansatz mit Euren Antworten mal ein wenig verbessert, bekomme das ganze aber leider nicht durch compiliert. in beiden Operatoren Fkts meckert er, dass versucht wird eine Referenz an ein lokales Object (beim Proxy) bzw. eine lokale Variable (beim eigentlichen Wert) zurück zugeben.
die beiden Op funktionen sehen jetzt so aus
CECTableProxy& CECTableData::operator[](int x) { return CECTableProxy(this, x); } string& CECTableProxy::operator[](int y) { return __owner->GetValue(x, y); }Gruß Peter
-
PeterK schrieb:
Hallo,
Danke schon mal für die Antworten!
Ich hab meinen Ansatz mit Euren Antworten mal ein wenig verbessert, bekomme das ganze aber leider nicht durch compiliert. in beiden Operatoren Fkts meckert er, dass versucht wird eine Referenz an ein lokales Object (beim Proxy) bzw. eine lokale Variable (beim eigentlichen Wert) zurück zugeben.
die beiden Op funktionen sehen jetzt so aus
CECTableProxy& CECTableData::operator[](int x) { return CECTableProxy(this, x); } string& CECTableProxy::operator[](int y) { return __owner->GetValue(x, y); }Gruß Peter
das proxy darf nat. auch keine referenz sein. beim proxy wiederum kannst du nur dann eine referenz zurückgeben, galls GetValue eine referenz zurückgibt. im übrigen sind bezeichner mit doppeltem unterstrich reserviert.
-
ok ich habs jetzt hinbekommen nachdem ich ein objekt vom proxy anlegen und GetValue wieder freigebe allerding klappt die zuweisung immer noch nicht

CECTableProxy& CECTableData::operator[](int x) { this->tpTemp = new CECTableProxy(this, x); return *tpTemp; } string& CECTableProxy::operator[](int y) { return __owner->GetValue(x, y); } string& CECTableData::GetValue(int iX, int iY) { delete this->tpTemp; return this->m_Grid[iX][iY]; }wenn ich jetzt eine zuweisung alla
string s = obj[0][0];versuche, meint er "Keine Übereinstimmung von string::operator =(CECTableProxy) gefunden"
wie kann ich erreichen, dass erst die beiden operatoren aufgelöst werden bevor die zuweisung an s durchgeführt wird ?
-
@ camper,
danke für den hinweis, ist ohne Ref. schöner dann kann ich mir auch das erzeugen von meinem temp obj wieder sparen....
-
und ein letztes kommentar zum thema für heut abend...
ich habe festgestellt, dass es funktioniert wenn ich die zuweisung so durchführe
s = tab->operator [](0).operator [](0);so nicht ...
s = tab[0][0];was mach ich da noch falsch ?
Schönen Abend noch Gruß Peter
-
Hi,
also was dein letztes Beispiel betrifft, wundere ich mich jedenfalls darüber, dass du tab->operator[](0) sagst und unten einfach tab[0], da würde für mich (*tab)[0] mehr Sinn machen.

MfG Eisflamme
-
ja so gehts auch, ich möchte es aber so ansprechen können ...
xy = tab[0][0];
was muss ich da ändern
Gruß Peter
-
PeterK schrieb:
ja so gehts auch, ich möchte es aber so ansprechen können ...
xy = tab[0][0];
was muss ich da ändern
tab darf kein zeiger sein.
denn tab[0] ist einfach (*tab) erstmal ne dereferenzierung und somit ist tab[0] das tab objekt selber.
-
Danke,
jetzt bin ich durchgestiegen.
Gruß Peter
-
PeterK schrieb:
ja so gehts auch, ich möchte es aber so ansprechen können ...
xy = tab[0][0];
Wie wärs, wenn du aus dem Zeiger vorher eine Referenz machst.
CECTableData& table = *tab; xy = table[0][0];