Можете ли вы помочь мне с моим внутренним классом const_iterator? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь узнать больше об итераторах в 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 голосов
/ 07 октября 2018

Принимая предложения @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 .Но я надеюсь, что этот ответ поможет кому-то еще.

...