c++ - 抽象类的迭代器

pro*_*ton 2 c++ abstract-class

我有一个抽象类,例如一个代表几何形状的类。我将有从 继承的具体类Shape,例如矩形和三角形。

我想遍历一个形状所组成的点(另一个类),因此Shape必须为其提供一个接口。迭代应该是这样的:

for(Point p : shapeObject){ ... some code}
Run Code Online (Sandbox Code Playgroud)

但我不希望Shape该类为子类确定要使用的容器。例如,矩形将有一个std::array<Point, 4>容器,而三角形将有一个std::array<Point, 3>容器。

所以我的问题是,最优雅的 C++ 方法是什么?

jua*_*nza 5

在点存储在支持随机访问迭代的容器中的特定情况下,解决“问题” *的简单方法(例如std::arraystd::vector使用普通指针作为迭代器:

struct Point {};

struct Shape
{
    typedef Point* iterator;
    typedef const Point* const_iterator;
    virtual iterator begin() = 0;
    virtual const_iterator begin() const = 0;
    virtual iterator end() = 0;
    virtual const_iterator end() const = 0;
    virtual ~Shape() {}
};
Run Code Online (Sandbox Code Playgroud)

并让派生类实现begin()end()使用指向它们保存的数组的第一个和最后一个元素的指针。

或者,您可以将类型擦除与boost.any_range或通过any_iterator类型一起使用。这可能超出了这个答案的范围,但这里有一篇关于这个问题的好文章


* 那是假设确实存在需要隐藏迭代器类型的问题。请注意,您还可以编写模板代码来处理不同的迭代器类型。