Überladen des Index Operator []



  • Hallo zusammen,

    ich bin gerade dabei, eine Container Klasse für eine map zu schreiben, die ungefähr das können soll, wie die STL map Klasse auch. Unter anderem möchte ich hierfür auch den [] Operator überladen.

    Dies funktioniert auch wunderbar, wenn ich den Operator dazu verwende, ein Element (Iterator) eines bestimmten Keys zu bekommen:

    element = mymap["key"];
    

    Allerdings möchte ich das auch andersrum verwenden, sprich ich möchte den Wert eines Elements anhand eines bestimmten Keys neu zuweisen:

    mymap["key"] = "new value";
    

    Diese zweite Version des Aufrufs nun funktioniert nicht.
    Den Operator habe ich wie folgt überladen:

    // ...
    // deklaration in der klasse
    Element<T> *operator[](std::string) const;
    // ...
    // operator overloading
    template<typename T>
    Element<T> *HashMap<T>::operator[](std::string k) const
    {
      return this->getElement(k);
    }
    

    Tja, soweit bin ich gekommen.
    Hat jemand eine Idee, ich den gewünschten Effekt erreichen kann?

    Grüsse und vielen Dank im Voraus, Matthias

    PS: Achja, muss ich den = Operator dafür auch noch überladen?



  • jop, aber nicht für die Containerklasse, sondern für die Elementklasse

    du könntest natürlich statt Element<T> auch einfach T zurückgeben,
    sofern das ein Standardtyp ist, dann brauchst du den = Opertaor nicht zu überladen.



  • Sorry, ich verstehe nicht ganz.
    Was muss ich tun, damit der [] Operator in beiden Varianten funktioniert?



  • Du gibst einen Zeiger zurück, Du musst aber eine Referenz zurückgeben. op= brauchst Du nicht zu überladen.



  • ok, ich habe jetzt also zwei Definitionen:

    Element<T>	*operator[](std::string) const;	// overloaded [] operator
    Element<T>	&operator[](const std::string);	// overloaded [] operator
    

    Nun funktioniert aber der ursprüngliche Aufruf nicht mehr 😞

    Könnte mir vielleicht jemand etwas genauer erklären, was zu tun ist?
    Ich fürchte ich stehe etwas auf der Leitung.

    Vielen Dank!



  • Warum soll denn dein operator[] einen Zeiger zurückgeben?
    Normalerweise hat man hier einen non-const operator[], der eine Referenz zurückgibt, und einen const, der eine konstante Referenz zurückgibt.



  • ok, aber wie sieht dann die Zuweisung aus für:

    Element<std::string> el = map["key"];
    Element<std::string> *el2 = map["key"];
    

    Mir ist klar, dass diese beiden Ausdrücke falsch sind.
    Ich versuche nur zu verdeutlichen, worauf ich hinaus will.

    Und: Was muss dann der Operator zurück liefern?

    return ???;
    

    lg, Matthias



  • Deine Methodendefinitionen sind schon falsch (passen nicht zusammen) - und der Rückgabetyp wird bei der Überladungsauflösung gar nicht betrachtet. Besser sieht's so aus:

    const Element<T>& operator[](const string&) const;
    Element<T>&       operator[](const string&);
    


  • Schiel doch mal in den map-header der STL-implementierung deines Compilerherstellers. Dann weißt du, wie die Signaturen aussehen könnten.
    Sonst siehe auch hier: http://www.cplusplus.com/reference/stl/map/


Anmelden zum Antworten