Как я могу использовать перегруженный const_iterator внутри класса? - PullRequest
0 голосов
/ 03 января 2019

Я занимаюсь университетским проектом на C ++, целью которого является научиться использовать разные контейнеры STL и их итераторы.

В моей программе есть класс с набором:

class ConjuntoDeLetras{
    private:
        set<Letra> letras;

    public:
        ConjuntoDeLetras();   
        ···
};

Внутри класса у меня есть два вложенных класса: итератор и const_iterator. (Я не знаю, является ли это лучшим способом создания итераторов классов, но учитель говорит нам, что нам нужно делать таким образом):

class iterator{
    private:
        set<Letra>::iterator it;
    public:
        iterator();

        Letra operator*();

        ConjuntoDeLetras::iterator& operator++();

        ConjuntoDeLetras::iterator& operator+=(int num);

        bool operator==(const ConjuntoDeLetras::iterator &i);

        bool operator!=(const ConjuntoDeLetras::iterator &i);

        friend class ConjuntoDeLetras;
};

class const_iterator{
    private:
        set<Letra>::const_iterator it;
    public:
        const_iterator();

        Letra operator*();

        ConjuntoDeLetras::const_iterator& operator++();

        ConjuntoDeLetras::const_iterator& operator+=(int num);

        bool operator==(const ConjuntoDeLetras::const_iterator &i);

        bool operator!=(const ConjuntoDeLetras::const_iterator &i);

        friend class ConjuntoDeLetras;
};

Оба метода класса итератора работают хорошо. В ConjuntoDeLetras классе у нас есть методы начала и конца:

ConjuntoDeLetras::iterator begin();
ConjuntoDeLetras::const_iterator begin() const;
ConjuntoDeLetras::iterator end();
ConjuntoDeLetras::const_iterator end() const;

Проблема здесь. Когда я собираюсь использовать const_iterator, у нас возникают проблемы:

ConjuntoDeLetras::const_iterator itL;

for(itL=L.begin(); itL!=L.end(); ++itL){
    CantidadLetras aux;
    aux.frecuenciaAbsoluta = 0;
    aux.frecuenciaRelativa = 0;
    aux.letra = (*itL).getLetra();

    salida.push_back(aux);
}

Когда я выполняю этот код, компилятор говорит, что у меня нет operator= для const_iterator для итератора. Я знаю причину проблемы, потому что объект L не является константной переменной и использует обычные итераторы begin() и end(). Я думал об удалении последней константы функций, но я не могу перегрузить функцию только типом возвращаемого значения. Я не знаю, какое решение лучше. Вот ошибка компилятора:

error: no match for ‘operator=’ (operand types are ‘ConjuntoDeLetras::const_iterator’ and ‘ConjuntoDeLetras::iterator’)
 for(itL=L.begin(); itL!=L.end(); ++itL){
                 ^

И та же ошибка с end().

1 Ответ

0 голосов
/ 03 января 2019

Вам не хватает другого оператора ++ и требуемых typedefs, чтобы быть итератором.

Плюс, вам нужно =default копировать / перемещать / присваивать.

Наконец вам нуженпреобразование конструктора из вашего iterator в const_iterator.

При желании можно добавить две перегрузки const_iterator::operator=(iterator) (копировать назначение и переместить назначение), а также const_iterator::operator==(iterator const&) и iterator==const_iterator аналогичным образом.

...