return problem mit std::map
-
class Rect { int x, y, w, h; public: Rect(int xx,int yy,int ww,int hh); } Rect::Rect(int xx, int yy, int ww, int hh): x(xx), y(yy), w(ww), h(hh) {} std::map<const char,Rect> rect_map void set(std::string str, Rect rect){ rect_map.insert ( std::pair<const char,Rect>(*str.c_str(),rect) ); } Rect get(std::string str){ return rect_map[*str.c_str()]; }fehler meldung:
../stl_map.h: In member function »_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = const char, _Tp = Rect, _Compare = std::less<const char>, _Alloc = std::allocator<std::pair<const char, Rect> >]«:19: instantiated from here
../stl_map.h:348: Fehler: keine passende Funktion für Aufruf von »Rect::Rect()«
5: Anmerkung: Kandidaten sind: Rect::Rect(Sint16, Sint16, Uint16, Uint16)
2: Anmerkung: Rect::Rect(const Rect&)
-
Hallo,
Dir fehlt in der Rect-Klasse einfach ein default-Konstruktor. Den benötigt map nunmal.
-
geht das auch der der default konstruktor im privat bereich bleibt
-
map sollte ihn schon aufrufen können. Also nein.
Das Problem beim operator[] von map ist, falls du einen key angibst, der noch nicht in der map ist wird ein neues Objekt erzeugt. Dazu brauchts den default-Konstruktor.
Warum willst du hier überhaupt eine map nehmen wenn du als Index nur einen char hast?
-
eigentlich soll der index ein string sein
-
kiba91 schrieb:
eigentlich soll der index ein string sein
Das steht da aber nicht.

-
Konrad Rudolph schrieb:
kiba91 schrieb:
eigentlich soll der index ein string sein
Das steht da aber nicht.

Vielleicht hat er std::map<std::string ,Rect> auf std::map<const char,Rect> "optimiert" weil letzteres schneller läuft

-
kiba91 schrieb:
eigentlich soll der index ein string sein
Ist er aber nicht - ein String ist std::string (zur Not auch "const char*", aber da mußt du dein Sortierkriterium selber dazubasteln), dein "const char" ist ein einzelnes Zeichen (und das "const" an der Stelle ist überflüssig).
-
gibt es den keine möglichkeit
das ich den default konstuktor auf private setze und std::map immer noch dadrauf zu greifen kann
-
Nein, geht nicht
-
Nicht wirklich (eventuell mit friend-Zugriff, aber davon wird dir jeder erfahrene Programmierer abraten). Du könntest natürlich auch deine get()-Funktion so umstellen, daß sie ohne den Index-Zugriff auskommt:
Rect get(const std::string& str) { map<string,Rect>::iterator pos = rect_map.find(str);//daß du lieber map<string,Rect> nehmen solltest, wurde schon erwähnt, oder? if(pos == rect_map.end()) { //ungütliger Name - hier kannst du dich austoben throw std::runtime_error("ungültiger Name"); } else return pos->second; }
-
eventuell mit friend-Zugriff, aber davon wird dir jeder erfahrene Programmierer abraten
wieso abraten?
p.S.: ja, ok, bei näherer Betrachtung erscheint es mir "abratenswert" (*g*), weil man durch den map-friend und map::operator[] die Möglichkeit hat den ctor "hinten herum" auszuführen und zu einem default konstruierten Element zu kommen. Und wenn es auf die Art geht dann sollte es gleich auch "normal" gehen...
-
hustbaer schrieb:
p.S.: ja, ok, bei näherer Betrachtung erscheint es mir "abratenswert" (*g*), weil man durch den map-friend und map::operator[] die Möglichkeit hat den ctor "hinten herum" auszuführen und zu einem default konstruierten Element zu kommen. Und wenn es auf die Art geht dann sollte es gleich auch "normal" gehen...
Genau darum
Ich gehöre zwar nicht zu den Leuten, die "friend" komplett verteufeln. Aber ich überlege mir grundsätzlich genau, wem ich friend-Zugriff gebe - und das mache ich nur bei Klassen/Funktionen, von denen ich genau weiß, wie sie mit ihren erweiterten Rechten umgehen werden.