operator[] mit Zuweisung
-
Hallo.
Ich schreibe gerade an einer spezialisierten Arrayklasse (ähnlich wiestd::map). Arbeitet auch mit Iteratoren und funktioniert bisher auch wunderbar.
Jedoch stellt sich mir aktuell das Problem, dass ich nicht weiß, wie ich folgende Situation lösen kann:Array3D<int, float> x; x[22] = 0.5f; // Der Key 22 existiert noch nichtWie überlade ich diese Zuweisung korrekt, und wie löse ich das Problem, auch etwas einzutragen, wenn der Key noch nicht existiert?
Gruß
-
operator[] überladen:
valuetype& operator[](KeyType kt);
Die Funktion muss so aufgebaut sein, dass wenn in der hinterliegenden Datenstruktur kein Element mit dem entsprechenden Key gibt, so wird eines automatisch erstellt und zurückgegeben.
-
Hi.
Stimmt. Hier erstmal mein Code:K &operator[](const T &Key) { Iterator It = (*this)[Key]; // ruft den anderen operator[] auf if (It == this->End()) { return this->Append(Key)->Value; } return It->Value; } Iterator operator[](const T &Key) const { for (Iterator It = this->Begin(); It != this->End(); It++) { if (It->Key == Key) { return It; } } return this->End(); }Problem ist jetzt folgendes: Es wird immer der erste
operator[]aufgerufen, auch in Situationen in denen das gar nicht passt. Ich dachte immer, der Compiler ist schlau genug um das hinzukriegen.Beispiel:
Array3D<int, float> x; x.Erase(x[0]); // es wird der erste operator[] aufgerufen - warum? Erase nimmt nämlich einen Iterator... x[22] = 0.5f; // funktioniert :)Gruß
-
Rückgabewert ist nicht von belang, da er nicht zur Funktionssignatur gehört:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1893770.html#1893770Der einzige Grund, wieso deine Überladung überhaupt funktioniert, liegt an dem
const, denn dieses gehört zur Funktionssignatur
Grüssli
-
Ok. Habe mich nun gegen den 2. operator[] entschieden und diesen in Find umbenannt.
Gruß