falscher Rückgabewer einer Funkiotn führte zu stundenlanger Fehlersuche! (sehr interresant)



  • Hy,
    ich habe gerade fast 4 stunden damit verbracht einen klitzekleine Fehler in meinem Quelltext zu finden, und hätte dabei fast mehrmals hinterienander die Nervern verlohren!
    Ich habe eine Funktion gechrieben, welche mir den Vektor, welcher inerhalb einer statischen KLasse als private deklariert war, zurückgeben konnte damit ich dann mittels Iteratoren auf die Elemnete dieses Vectors zurückgreifen kann.
    Also in etwa so:

    Class a 
    {	private: static vector<b*> c;
    
    	public:	 static vector<b*> a::getVector();
    };
    

    nun wollte ich inerhalb einer For-schleife auf alle Elemnete des Vektors per Iterator zugreifen; also zB so:

    void fkt()
    {	vector<b*>::iterator iter;
    
    	for(iter = a::getVector().begin(); iter != a::getVector().end; iter++)
    	{	//mache etwas mit den Elementen }
    }
    

    Nun soweit so gut; aber, jetz kommts. Auf das erste element des Vectors wurde nie korrekt zugegriffen, da scheinbar über das Konstrukt

    a::getVector().begin()
    

    ein falscher start Iterator zurückgegeben wurde. Warum?
    Weis jemand eine erkllärung?
    Erst als ich eine Funktion deklarierte, welche mir direkt den Start- und Enditerator zurückgab, funktionierte mein code.
    Hm, ich habe dafür keinerlei erklärung, vlt ihr ja. würde mich freuen dies mal zu diskutieren., ICh bin jedenfalls froh, das mein Programm nach stundenlanger schreibarbeit und Fehlersuche nun endlich funktioniert.
    mfg Kante



  • gib doch mal ne referenz zurück sonst wird der vector ja kopiert und somit sind die iteratoren von 2 verschiedenen vectors und keiner vom original.



  • Kante23 schrieb:

    Nun soweit so gut; aber, jetz kommts. Auf das erste element des Vectors wurde nie korrekt zugegriffen, da scheinbar über das Konstrukt

    a::getVector().begin()
    

    ein falscher start Iterator zurückgegeben wurde. Warum?

    Weil die Kopie des vectors, die der Aufruf von getVector erzeugt, gleich danach wieder zerstört wird. Dasselbe gilt für die anderen Kopien, die jedesmal am Ende des Schleifenkörpers erzeugt werden, wenn du getVector().end() aufrufst. Du arbeitest da nur mit ungültigen Iteratoren.

    Eine Lösung wäre, wie vermutung sagte, eine (const) Referenz zurückzugeben. Oder (falls die Kopie beabsichtigt war), vorher einmal getVector aufzurufen, und dann auf der Kopie zu arbeiten.


Anmelden zum Antworten