我有一个抽象类,例如表示几何形状的类。我将拥有继承自 Shape
的具体类,例如矩形和三角形。
我想遍历组成形状的点(另一个类),所以 Shape
必须为它提供一个接口(interface)。
迭代应该以这种方式进行:
for(Point p : shapeObject){ ... some code}
但我不想要 Shape
类来确定子类使用什么容器。例如,一个矩形将有一个 std::array<Point, 4>
容器,而三角形将有一个 std::array<Point, 3>
容器。
所以我的问题是,最优雅的 C++ 方法是什么?
最佳答案
解决“问题”的简单方法* 在点存储在支持随机访问迭代的容器(例如 std::array
或std::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() {}
};
并让派生类使用指向它们持有的数组的第一个和最后一个元素的指针实现 begin()
、end()
。
或者,您可以使用类型删除,例如boost.any_range或者通过 any_iterator
类型。这可能超出了这个答案的范围,但是here is a good article on precisely this problem .
* 这是假设确实存在需要隐藏迭代器类型的问题。请注意,您还可以编写模板代码来处理不同的迭代器类型。
关于c++ - 抽象类的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39463756/