return problem mit std::map



  • 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.


Anmelden zum Antworten