我试图学习有关c ++中迭代器的更多信息,因此我构建了一个类持有器,其中包含一个要转换为int的向量。然后,我建立了一个内部迭代器子类,一切正常。然后,我认为我应该建立一个const_iterator子类,作为新手,我不知道如何在我的新子类中使所有const东西正常工作。
class Holder
{
public:
Holder(list<int> _mylist = list<int>()) : mylist(_mylist) {}
class iterator;
iterator begin() { return iter.begin(*this); }
class iterator
{
public:
iterator() {};
iterator begin(Holder &h) {
lit = h.mylist.begin();
return *this;
}
int operator*() { return *lit; }
iterator& operator++() { ++lit; return *this; }
private:
list<int>::iterator lit;
};
class const_iterator;
const_iterator begin() const { return citer.begin(*this); }
class const_iterator
{
public:
const_iterator() {};
const_iterator begin(const Holder &h) const {
lit = h.mylist.begin();
return *this;
}
int operator*() { return *lit; }
const_iterator& operator++() { ++lit; return *this; }
private:
list<int>::const_iterator lit;
};
private:
list<int> mylist;
iterator iter;
const_iterator citer;
};
特别是在第28行“ lit = h.mylist.begin()”,我得到了错误消息“ 没有运算符'='匹配这些操作数”,我知道我只是不了解魔术 const ,但是在某些情况下需要const_iterators,但我不知道如何解决。使我摆脱迷雾的任何帮助将不胜感激。
答案 0 :(得分:0)
根据@SamVarshavchik和@ zett42的建议,我进行了一些更改,这些更改似乎对我有用。
class Holder
{
public:
Holder(list<int> _mylist = list<int>()) : mylist(_mylist) {}
class iterator;
iterator begin()
{
iterator iter;
iter.lit = mylist.begin();
return iter;
}
class iterator
{
public:
iterator() {};
int operator*() { return *lit; }
iterator& operator++() { ++lit; return *this; }
friend class Holder;
private:
list<int>::iterator lit;
};
class const_iterator;
const_iterator begin() const
{
const_iterator citer;
citer.lit = mylist.begin();
return citer;
}
class const_iterator
{
public:
const_iterator() {};
const_iterator(iterator it) : lit(it.lit) { }
int operator*() const { return *lit; }
const_iterator& operator++() { ++lit; return *this; }
friend class Holder;
private:
list<int>::const_iterator lit;
};
private:
list<int> mylist;
};
int main()
{
list<int> intList = { 1,2,3,4 };
const Holder chold(intList);
auto cit = chold.begin();
cout << *++cit << endl;
Holder hold(intList);
auto ait = hold.begin();
Holder::const_iterator it = hold.begin()
++it;
cout << *++it << endl;
}
不再相关-我仍然不确定为什么可以声明 const_iterator begin()const ,但将其定义为 const_iterator begin() 而没有 const 关键字。但我希望这个答案对其他人有帮助。