2016-09-13 55 views
2

我有一個抽象類,例如一個類表示一個幾何形狀。我將從Shape繼承具體的類,如矩形和三角形。C++ - 一個抽象類的迭代器

我想遍歷一個形狀組成的點(另一個類),所以Shape必須爲它提供一個接口。 迭代應該以這種方式:

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

但我不希望Shape類,以確定孩子上課用什麼容器。例如,矩形將具有一個std::array<Point, 4>容器,而三角形將具有一個std::array<Point, 3>容器。

所以我的問題在於,什麼是最優雅的C++方式來做到這一點?

+1

你可以看看(或直接使用)['any_range'](http://www.boost.org/doc/libs/1_61_0/libs/range/doc/html /range/reference/ranges /any_range.html)和Boost的'any_iterator'。 – Angew

回答

4

一種簡單的方式來解決「問題」在其中點被存儲在容器中支持隨機存取迭代的特定情況下*(如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


*這是假設真的有需要隱藏迭代器的類型的問題。請注意,您也可以編寫模板代碼來處理不同的迭代器類型。