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.
-
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[].
-
-
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)
-
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).