Iteratoren und Zeiger



  • Mir ist gerade aufgefallen, dass folgender Code unter VC++ 6 einwandfrei übersetzt wird und auch funktioniert :), aber unter neueren C++-Compilern zu Übersetzungsfehlern führt (VC++ 7.1, VC++ 8 Beta).

    struct test
    {
    	int i1;
    	int i2;
    };
    
    test* getAddr (vector <test>& tv)
    {
    	vector <test>::iterator it = tv.begin();
            // mach was mit iterator
    	return it;
    }
    

    Ich denk mal, dass die aktuellen Compiler wohl eher recht haben; mich würd aber interessieren, wie so ein Fall offiziell geregelt ist. Als Lösung bietet sich

    return &*it;
    

    an, das sieht aber schon ziemlich krass aus, scheint aber zu funktionieren.



  • Hi,

    Wenn der Code funktioniert ist das reiner zufall, da Du ein lokales Object erzeugst, das nach dem Verlassen der Funktion wieder aus dem Speicher gelöscht wird, aber einen Zeiger darauf zurückgibst. der Zeigt dann natürlich ins leere.

    grüße Con@n

    [EDIT] als Legasteniker hat man heutzutage echt schwer 😃



  • ein iterator ist ein iterator und muss kein Zeiger auf ein Objekt sein.

    Nimm zB mal einen Baum - da kannst du einen iterator nicht gut als Zeiger implementieren - genauso bei einer liste.

    &*it
    ist korrekt

    damit bekommst du einen Zeiger auf das Objekt auf das der iterator verweist. Aber der iterator selbst muss kein Zeiger sein.

    zB ist es in der Debug Version recht praktisch, wenn die iteratoren sehr viel wissen über den Container usw. haben um Fehlern vorzubeugen.

    btw:
    du lieferst keinen Zeiger auf ein lokales Objekt zurück - der Code ist mit &*it korrekt.



  • Shade Of Mine schrieb:

    btw:
    du lieferst keinen Zeiger auf ein lokales Objekt zurück - der Code ist mit &*it korrekt.

    Ist mir klar, dass das gehen muss, weil ich ja mit *it eine Referenz auf das Objekt direkt im std::vector erhalte und keine lokale Kopie erstellt wird.

    Das ganze scheint auch nur zu funktionieren, weil es irgendwie eine implizite Konvertierung vom iterator zum Zeiger gibt.
    Wenn ich dasselbe mit einer std::map versuche klappt's nicht da es dann diese Konvertierung nicht gibt (geben kann).


Anmelden zum Antworten