c++ - 抽象类的迭代器

标签 c++ abstract-class

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

我想遍历组成形状的点(另一个类),所以 Shape必须为它提供一个接口(interface)。 迭代应该以这种方式进行:

for(Point p : shapeObject){ ... some code}

但我不想要 Shape类来确定子类使用什么容器。例如,一个矩形将有一个 std::array<Point, 4>容器,而三角形将有一个 std::array<Point, 3>容器。

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

最佳答案

解决“问题”的简单方法* 在点存储在支持随机访问迭代的容器(例如 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() {}
};

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

或者,您可以使用类型删除,例如boost.any_range或者通过 any_iterator 类型。这可能超出了这个答案的范围,但是here is a good article on precisely this problem .


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

关于c++ - 抽象类的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39463756/

相关文章:

c++ - OpenCV Mat::t 文档示例中的 lambda 指的是什么?

c++ - 如何在基类 vector 中返回派生对象的拷贝?

c# - 接口(interface)和只有一个抽象方法的抽象类有什么区别?

java-反射: How to Override private static abstract inner class method?

c++ - 如何压缩无符号字符的 C++ vector 以进行快速比较?无需减压

c++ - 带有调试输出的 X3 解析器段错误 (BOOST_SPIRIT_X3_DEBUG)

c++ - 在C++中的本地范围内使用Lambda

c++ - 帕斯卡风格的铁路图

c++ - 通过接口(interface)完成 copy-and-swap

scala - 为什么在这种情况下 classOf[...] 会显示 'not found: type foo' ?