Iterator NULL setzen im VS 2008



  • Hallo,

    bis jetzt habe ich die ganze Zeit im Visual Studio 6 gearbeitet. Jetzt wollte ich das Projekt ins VS 2008 konvertieren und dabei ist mir ein Fehler aufgefallen, der dabei das Hauptproblem darstellt:
    Ich kann nicht mehr, wie im VC++ 6 einen Iterator auf eine Liste "NULL setzen". (Entweder direkt it = NULL oder return NULL, wenn ein iterator als Rückgabewert erwartet wird) Im 6er-Studio war das möglich. Nach ein wenig Recherche habe ich herausgefunden, dass das eigentlich nicht sinnvoll ist, eine richtige Lösungsmöglichkeit ist mir dabei leider nicht über den Weg gelaufen. Ich frage mich also jetzt, was ich analog schreiben kann, sodass es vom VS 2008 akzeptiert wird.

    Danke wie immer für Hilfe. 🙂



  • vector<irgendwas> v;
    vector<irgendwas>::iterator it = v.end();
    


  • jencas schrieb:

    vector<irgendwas> v;
    vector<irgendwas>::iterator it = v.end();
    

    Dazu hätte ich eine Frage:
    Ich habe derzeit einen Iterator und mehrere Listen. Zeigt dieses ".end()" dann in jeder Liste auf eine gleiche bestimmte Position, d.h. ist das analog zu "NULL", wo die eigentliche Liste egal ist oder muss ich jedesmal erst die Beziehung zwischen jeweiliger Liste und dem Iterator herausfinden?


  • Mod

    v.end ist natürlich spezifisch auf die eine Liste, denn Du kannst ja über diesen Iterator das vorhergehende Item erhalten durch --it!

    Du kannst den iterator in einen ungebundenen Zustand verstetzen.

    vector<irgendwas>::iterator it = vector<irgendwas>::iterator();
    


  • Martin Richter schrieb:

    v.end ist natürlich spezifisch auf die eine Liste, denn Du kannst ja über diesen Iterator das vorhergehende Item erhalten durch --it!

    Du kannst den iterator in einen ungebundenen Zustand verstetzen.

    vector<irgendwas>::iterator it = vector<irgendwas>::iterator();
    

    Danke für den Tipp, hat so funktioniert. Jedoch ist eine Frage offen geblieben:
    Wie kann ich überprüfen, ob z.B. das Anlegen des Iterators funktioniert hat?

    D.h.

    list<irgendwas>::iterator	it	= m_nidListeFreiIt;
    
    	if(it == NULL)       <--- analog zu diesem Aufruf im VC6
    		return NULL;
    

    Die Überprüfung:

    if(it == list<irgendwas>::iterator())
    		return NULL;
    

    wird zwar nicht als Fehler erkannt, führt aber zu einem Laufzeitfehler.



  • Ahalex schrieb:

    Die Überprüfung:

    if(it == list<irgendwas>::iterator())
    		return NULL;
    

    wird zwar nicht als Fehler erkannt, führt aber zu einem Laufzeitfehler.

    Klar, Du vergleichst den Iterator it mit einem neuen temporären Iterator, der durch list<irgendwas>::iterator() instanziiert wird.


  • Mod

    Oder anders gesagt. Diese beiden Iteratoren gehören nichtzum selben Objekt. Nur dann wären Sie vergleichbar.


Anmelden zum Antworten