009
05.01.2007, 11:43 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zitat von J-jayz-Z: |
Anscheinend funktioniert die Unterscheidung nur, wenn das Objekt const oder nicht const ist.
|
Diesen Umstand wollte ich Dir in Post 005 klar machen.
Letztlich solltest Du auch folgendes beachten: Intern scheinst Du in Deiner Klasse eine std::map zu nutzen. Wenn ich mich recht entsinne, dann hat eine Map gar keinen op[], welcher constant ist, weil nach einem
C++: |
std::map<std::string,int> my_map;
int i = my_map["test"];
|
in my_map implizit ein Eintrag angelegt wird, auch wenn er vorher nicht da war. dh ein op[] ist auf einer Map überhaupt niemals konstant.
Es gibt zwei offenkundige Möglichkeiten, wie Du Dein Problem umgehen kannst:
1. Du verwendest nicht den op[] in den überladenenen Versionen für lesen/schreiben, sondern einfach get und set methoden (find ich pers. in der Regel schlauer)
2. Wenn Dir die Unterscheidung zwischen lese und schreib-Operationen wirklich wichtig ist und du irgendwie unbedingt den op[] verwenden willst dann wirst Du einen Proxyobject verwenden müssen, welches du anstelle des eigentlichen Objects bei dem op[] zurück gibst. Dieses Proxyobject muss einen (a) Zuweisungoperator haben (write) (b) Typ-Konvertierungs operator haben (read)
Also für ein int zB (kann man auch nen Template draus machen):
C++: |
template<typename T> class proxy { T value; public: operator const T & () const { return value; } proxy& operator (const T& value) { this->value = value; return *this; } ... };
class DeineKlasse { proxy<std::string> operator[] (const std::string& key) const { ... } };
|
Du kannst nun lese und schreibzugriffe schön voneinander trennen und dennoch (mit einem gewissen Performancenachteil, den bei maps der op[] ohnehin nach sich zieht) mit dem op[] arbeiten. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 05.01.2007 um 11:46 Uhr von virtual editiert. |