您可以为我的const_iterator内部类提供帮助吗?

时间:2018-10-07 15:23:37

标签: c++ iterator const

我试图学习有关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,但我不知道如何解决。使我摆脱迷雾的任何帮助将不胜感激。

1 个答案:

答案 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 关键字。但我希望这个答案对其他人有帮助。