2016-04-04 18 views
1

Betrachten Sie diesen Code:Warum drucke ich Werte außerhalb des zulässigen Bereichs?

class Foo123 
{ 
    QList<int> a = (QList<int>()) << 1 << 2 << 3; 
    QList<int>::const_iterator it; 

public: 

    Foo123() 
    { 
     it = a.begin(); 
    } 

    void print() 
    { 
     qDebug() << *it; 
     while(move()) 
     { 
      qDebug() << *it; 
     } 
    } 


    bool move() 
    { 
     if(it != a.end()) 
     { 
      ++it; 
      return true; 
     } 

     return false; 
    } 
}; 

    Foo123 f; 
    f.print(); 

Ich bin immer eine zusätzliche Zahl am Ende des Druckens erhalten, wie folgt aus:

1 
2 
3 
58713 // this is random, from what I can tell 

Ich glaube, ich bin Wert des Bereichs Druck, aber ich didn verstehe nicht wie. Kann jemand auf meinen Fehler hinweisen?

+0

der Iterator werden überprüft, bevor Sie es erhöhen. Sie drucken grundsätzlich 'a.end()' als letzten Wert. – vu1p3n0x

+0

Es kann Verwirrung geben, dass 'a.end()' nicht auf das letzte Element zeigt, sondern ein "past-the-end" Iterator ist und nicht dereferenziert werden sollte. – vu1p3n0x

+0

@ vu1p3n0x: Ich glaube, ich habe übersehen, dass a.end() nicht auf das letzte Element zeigt ... – Jack

Antwort

4

Es ist, weil Sie zum ersten Mal erhöhen müssen, dann Test:

bool move() 
    { 
     ++it; 
     if(it != a.end()) { 
      return true; 
     } 

     return false; 
    } 
3

Beachten Sie, dass in C++ 11, können Sie eine Initialisiererliste verwenden, um die Liste (sic) zu initialisieren, und Sie können den Iterator initialisieren auch an Ort und Stelle.

Also, das Ganze, fest, wäre:

#include <QtCore> 

class Foo123 
{ 
    QList<int> a { 1, 2, 3 }; 
    QList<int>::const_iterator it { a.begin() }; 
public: 
    void print() 
    { 
     qDebug() << *it; 
     while (move()) qDebug() << *it; 
    } 
    bool move() 
    { 
     ++ it; 
     return (it != a.end()); 
    } 
}; 

int main() { 
    Foo123 f; 
    f.print(); 
}