为自定义数组实现迭代器

Implementing iterator for custom array

本文关键字:迭代器 实现 数组 自定义      更新时间:2023-10-16

我即将创建自己的可迭代泛型数组实现。我创建了一个名为 Iterable<E> 的接口,它将"强制"其所有继承者实现其所有纯虚拟方法。该界面具有以下原型:

可迭代

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> 的匿名嵌套实现,如下所示:

阵列迭代器

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;
};

然后,我将begin()end()方法中的ArrayIterator实例返回为:

  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它的实现,它不应该通过多态性工作吗?

您的beginend函数都返回Iterable<E>,而不是ArrayIterator。 创建要返回的ArrayIterator切片,仅返回所创建对象的基部分。

由于这需要创建抽象类,因此会出现编译错误。