为自定义数组实现迭代器

问题描述 投票:-1回答:1

我即将创建自己的可迭代通用Array实现。我创建了一个名为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();

类qazxsw poi有qazxsw poi的匿名嵌套实现,它看起来如下:

ArrayIterator

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; }; 方法中返回ArrayIterator实例:

begin()

一切都编译得很好,但是当我尝试使用每个时,我会抛出一个编译时错误:'Iterable cannon instantiable abstract class'在下面的例子中:

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 } } 这是它的实现,不应该通过多态?

c++ arrays iterator iterable
1个回答
0
投票

你的IterableArrayIterator函数都返回begin,而不是end。您创建的返回的Iterable<E>被切片,只返回创建的对象的基本部分。

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

© www.soinside.com 2019 - 2024. All rights reserved.