Я собираюсь создать свою собственную итерируемую универсальную реализацию 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
какова его реализация, не должна ли она работать через полиморфизм?
Ваш begin
а также end
обе функции возвращают Iterable<E>
не ArrayIterator
, ArrayIterator
вы создаете, чтобы вернуться нарезанный и только базовая часть созданного объекта возвращается.
Поскольку это требует создания абстрактного класса, вы получаете ошибку компиляции.
Других решений пока нет …