Eintrag in Map - Fehlender Standardkonstruktor wegen Referenz



  • Hallo,

    wenn ich einen Eintrag in eine map

    typedef std::map<std::string, Klasse> M;

    machen möchte, in der Form:

    M m;
    Klasse k;

    m["foo"] = k;

    , dann erwartet der Compiler, dass ich einen = Operator in der Klasse "Klasse" zur Verfügung stelle.

    Sehe ich es richtig, dass ein leeres Klasse-Objekt angelegt wird und die Zuweisung per = Operator durchgeführt wird?
    Im Endeffekt bedeutet das, dass sowohl der Standardkonstruktor als auch ein quasi Kopierkonstruktor aufgerufen wird.

    Mein Problem hierbei ist, dass ich in "Klasse" Membervariablen verwende die als Referenz gespeichert sind. Der Compiler erwartet nun, dass diese durch die Konstruktoren initialisiert werden (per Temp-Variable), daher ist es nicht möglich den Standardkonstruktor zu verwenden. Den will aber die Mapzuweisung...

    Irgendwie ist das eine Zwickmühle.

    Ist meine oben aufgeführte Vermutung korrekt? Was kann ich tun?

    DKT



  • Ja, deine Vermutung ist korrekt - op[] legt einen map-Eintrag mit einem leeren Wert an (wenn der Eintrag noch nicht existierte) und gibt eine Referenz auf diesen Eintrag zurück, die du dann mit op= überschreiben kannst. Dazu braucht deine Klasse einen Default-Ctor und einen Zuweisungsoperator (letzterer könnte auch ein Problem werden, wenn du Referenz-Elemente verwendest). Eine Alternative zu dem Aufruf bildet insert():

    m.insert(make_pair("foo"),k));
    


  • Ok, gut.

    Das mit insert habe ich mir auch schon überlegt. Ich werde es ausprobieren.

    Danke
    DKT


Anmelden zum Antworten