Hinzufügen von Objekt zu std::map benötigt Defaultkonstruktor in Objektklasse?



  • Hi,

    folgendes ist gerade vom Compiler moniert worden:

    class A
    {
    public:
          A(const std::string& my_argument)
          {  //blabla}
    };
    
    void addMyAFunction(const A& addme)
    {
      std::map<std::string,A> my_map;
      my_map["dummy_key"] = addme;
    }
    

    Knallt mir

    no matching function for call to 'A::A()'|

    raus.
    Habe den natürlich erstmal ergänzt, aber kann ich das nicht umgehen? Brauch den Defaultkonstruktor sonst niemals.


  • Mod

    Der Defaultkonstruktor wird benötigt, weil der Operator[] bei Nichtauffinden des Eintrags an der Stelle ein default-konstruiertes Objekt anlegt.

    In C++11 gibt es map::at(), welches stattdessen eine out_of_range-Exception wirft und somit den Defaultkonstrukor nicht benötigt (du musst natürlich sicher sein, dass der Eintrag auch existiert oder auf die Exception gefasst sein). In C++98 gibt es find, welches bei Nichtauffinden den end-Iterator zurück gibt. Leider ist der Code damit eine Runde umständlicher als mit at oder Operator[].


  • Mod



  • SeppJ schrieb:

    Der Defaultkonstruktor wird benötigt, weil der Operator[] bei Nichtauffinden des Eintrags an der Stelle ein default-konstruiertes Objekt anlegt.

    In C++11 gibt es map::at(), welches stattdessen eine out_of_range-Exception wirft und somit den Defaultkonstrukor nicht benötigt (du musst natürlich sicher sein, dass der Eintrag auch existiert oder auf die Exception gefasst sein). In C++98 gibt es find, welches bei Nichtauffinden den end-Iterator zurück gibt. Leider ist der Code damit eine Runde umständlicher als mit at oder Operator[].

    Danke, meh, at() kann ich genau aus dem Grunde nicht nutzen, da die Einträge vorher nicht in der map existieren.
    Mist, dann brauch ich tatsächlich einen Defaultkonstruktor der nichts tut 😞 (igitt)


  • Mod

    Namenloser324 schrieb:

    Danke, meh, at() kann ich genau aus dem Grunde nicht nutzen, da die Einträge vorher nicht in der map existieren.
    Mist, dann brauch ich tatsächlich einen Defaultkonstruktor der nichts tut 😞 (igitt)

    Nein. Ich dachte, es geht um Zugriff. Zum Einfügen gibt es insert (oder emplace. Oder emplace_hint).


Anmelden zum Antworten