operator[] mit Zuweisung



  • Hallo.
    Ich schreibe gerade an einer spezialisierten Arrayklasse (ähnlich wie std::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 nicht
    

    Wie ü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ß


  • Administrator

    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#1893770

    Der 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ß


Anmelden zum Antworten