2014-09-23 133 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>&,主叫方可以复制如果需要的话。