Реализация итератора для пользовательского массива

Я собираюсь создать свою собственную итерируемую универсальную реализацию Array. Я создал интерфейс под названием Iterable<E>что заставит всех его наследников реализовать все чисто виртуальные методы. Интерфейс имеет следующие прототипы:

Iterable

public:
virtual Iterable<E>& operator=(const Iterable<E>& iter) = 0;
virtual bool operator==(const Iterable<E>& iter) const = 0;
virtual bool operator!=(const Iterable<E>& iter) const = 0;
virtual Iterable<E>& operator++() = 0;
virtual E& operator*() = 0;

В моем Array<E> Я создал следующие методы:

Iterable<E> begin();
Iterable<E> end();

Учебный класс Array<E> имеет анонимную вложенную реализацию Iterable<E>, который выглядит следующим образом:

ArrayIterator

class ArrayIterator : public Iterable<E> {
public:
ArrayIterator(Array<E>* array, const int index) : _array(array), _index(index) {};

ArrayIterator& operator=(const ArrayIterator& iter) override { _index = iter._index; return *this; }
bool operator==(const ArrayIterator& iter) const override { return _index == iter._index; }
bool operator!=(const ArrayIterator& iter) const override { return _index != iter._index; }
ArrayIterator& operator++() override { _index++; return *this; }
E& operator*() override { return _array[_index]; }
private:
Array<E>* _array;
int _index;
};

Потом я вернулся ArrayIterator экземпляры в обоих begin() а также end() методы как:

  Iterable<E> Array<E>::begin() {
return ArrayIterator(this, 0);
}

Iterable<E> Array<E>::end() {
return ArrayIterator(this, this->length()); //length() returns array size
}

Все компилируется просто отлично, но когда я пытаюсь использовать для каждого из них, я выдаю ошибку во время компиляции:
«Итерируемая пушка инстанцируемый абстрактный класс»
в следующем примере:

int main() {
Array<int> array{1, 2, 3, 4};
for(int i : array) {  //<- error points to this line

}
}

Как Iterable Я вернулась ArrayIterator какова его реализация, не должна ли она работать через полиморфизм?

-1

Решение

Ваш begin а также end обе функции возвращают Iterable<E>не ArrayIterator, ArrayIterator вы создаете, чтобы вернуться нарезанный и только базовая часть созданного объекта возвращается.

Поскольку это требует создания абстрактного класса, вы получаете ошибку компиляции.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]