2016-04-04 14 views
1

このコード考えてみましょう:なぜ値が範囲外で印刷されていますか?

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(); 

私はいつもそのように、印刷の最後に余分な番号を取得しています:

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

私は範囲の値を印刷していますが、私はdidnの推測方法を理解していない。誰かが私の間違いを指摘できますか?あなたが最初にインクリメントする必要があるため

+0

。基本的に最後の値として 'a.end()'を表示しています。 – vu1p3n0x

+0

'a.end()'は最後の要素を指すのではなく、「過去と最後の」イテレータであり、逆参照されるべきではないという混乱が生じるかもしれません。 – vu1p3n0x

+0

@ vu1p3n0x:私はa.end()が最後の要素を指していないことを逃したと思います... – Jack

答えて

4

その後、テストだ:

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

     return false; 
    } 
3

C++ 11には、リスト(SIC)を初期化する初期化子リストを使用することができ、あなたはイテレータを初期化することができます。なおインプレースでも。

ので、全部は、固定、次のようになります。あなたはそれをインクリメントする前に、イテレータをチェックしている

#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(); 
} 
関連する問題