Accessorfunktion



  • Hallo,
    ich schreibe gerade eine Klasse (was ich selten tue!) und bekomme Probleme, wenn ich folgendes tun will:

    for(list<Mol*>::iterator i = mols.begin(); i!= mols.end(); i++)
        {
                for(map<int,int>::iterator j = (*i)->getTC().begin(); j!=(*i)->getTC().end();j++)
    	{      
    	  //...irgendwas
    	}
        }
    

    Mol ist dabei meine Klasse, die ein Attribut torsion_count hat, das ich mit getTC() zurückgebe. Das Programm tut aber erst, wenn ich schreibe:

    for(list<Mol*>::iterator i = mols.begin(); i!= mols.end(); i++)
        {
          map<int,int> tc = (*i)->getTC();
          for(map<int,int>::iterator j = tc.begin(); j!=tc.end();j++)
    	{      
    	  //...
    	}
        }
    

    Wieso ist das so, oder was mache ich falsch?



  • Die Iteratoren, die du über begin() und end() kriegst, sind nur "gültig" fürein und dasselbe Map-Objekt. Im ersten Code-Fragment erzeugst du über getTC() aber immer neue maps, die inhaltlich zwar gleich sind(nehm ich an, ich kenn ja die Klasse nicht!), aber letzlich nur Kopien sind.

    Btw. das 2.Fragment is so oder so lesbarer und besser. Es ist nicht sinnvoll Funktionen, die Objekte rausgeben, mehrfach auszuführen. Stattdessen lieber das Ergebnis cachen. Außerdem nimm besser ++op (operator++()) statt op++ (operator++(int)) für Iteratoren.



  • Dann sollte getTC vielleicht eine Referenz auf eine map zurückgeben und tc als Referenz definiert werden.



  • Ach sooo, ja, alles klar! Vielen Dank für Eure Hilfe!


Anmelden zum Antworten