2014-09-23 152 views
0
class ZoningIter 
{ 
private: 
    CTile::Zonings mZoning; 
    CCity *mCity; 
    int mPos;  ///< Position in the collection 

public: 
    ZoningIter(CCity *tile, int pos, CTile::Zonings zoning) : mCity(tile), mPos(pos), mZoning(zoning) 
    {  
     while (mPos < mCity->mTiles.size()) 
     { 
      if (mCity->mTiles[mPos]->GetZoning() == mZoning) 
       break; 
      else 
       mPos++; 
     }  
    } 

    bool operator!=(const ZoningIter &other) const 
    { 
     return mPos != other.mPos; 
    } 

    std::shared_ptr<CTile> operator *() const 
    {    
     return mCity->mTiles[mPos]; 
    } 

    const ZoningIter& operator++() 
    {      
     auto size = mCity->mTiles.size(); 
     auto myzone = mCity->mTiles[mPos]->GetZoning(); 

     while (mPos < size-1) 
     { 
      ++mPos; 
      if (mCity->mTiles[mPos]->GetZoning() == mZoning) 
       break; 
     } 
     return *this;   
    } 
}; 

不知道我在這個迭代器中做錯了什麼。這個類迭代器假設循環遍歷CCity類,然後比較我想要返回的方塊。 一個問題,我可以看到它遇到一個無限循環不知道如何解決它?有任何想法嗎?C++迭代器類

+0

我只是假設mTiles是一個向量,那麼如果你調用pos大於大小的構造函數,那麼迭代器上的所有*後面的操作都會爆炸。此外,像刪除一個元素的矢量的任何改變將(可能)使它炸燬。 – Surt 2014-09-23 21:44:59

回答

1

由於你的operator++不會增加到一個過去的所有元素,也就是所謂的結束迭代器,所以你正在運行一個無限循環。

while (mPos < size-1) // <-- This line is wrong, stops too early 

它掩蓋了以後做檢查成功的錯誤。

無論如何,它應該以一個增量開始,然後檢查它是否可以循環。
了更正,既有去除錯誤:

const ZoningIter& operator++() { 
    while(++mPos < mCity->mTiles.size() 
     && mCity->mTiles[mPos]->GetZoning() != mZoning) 
     {} 
    return *this; 
} 

此外,返回類型的operator*()應該是const std::shared_ptr<CTile>&,主叫方可以複製如果需要的話。