我目前正在一個項目中,我想定義一個通用的'集合'接口,可能以不同的方式實現。集合接口應該指定集合具有按值返回迭代器的方法。使用類,包裝指針我想出了以下(大大簡化):C++類層次結構集合提供迭代器
Collection.h
class Collection
{
CollectionBase *d_base;
public:
Collection(CollectionBase *base);
Iterator begin() const;
};
inline Iterator Collection::begin() const
{
return d_base->begin();
}
CollectionBase.h
class CollectionBase
{
public:
virtual Iterator begin() const = 0;
virtual Iterator end() const = 0;
};
Iterator.h
class Iterator
{
IteratorBase *d_base;
public:
bool operator!=(Iterator const &other) const;
};
inline bool Iterator::operator!=(Iterator const &other) const
{
return d_base->operator!=(*other.d_base);
}
IteratorBase.h
class IteratorBase
{
public:
virtual bool operator!=(IteratorBase const &other) const = 0;
};
使用這種設計,收集的不同實現從CollectionBase
派生,並可以通過返回一個Iterator
一個包裝一些具體實施IteratorBase
返回其自定義的迭代器。
到目前爲止,一切都很好。我目前正試圖弄清楚如何實施operator!=
。 Iterator
將呼叫轉接到IteratorBase
,但運營商應該如何在那裏實施?一種簡單的方法是將IteratorBase
引用轉換爲IteratorBase
實現中的適當類型,然後執行IteratorBase
實現的具體比較。這假設你會玩得很好,但不會傳遞兩種不同類型的迭代器。
另一種方法是執行某種類型的檢查,檢查迭代器是否屬於同一類型。我相信這個檢查必須在運行時進行,考慮到這是一個迭代器,我寧願在operator!=
中執行昂貴的運行時類型檢查。
我在這裏錯過了更好的解決方案嗎?也許有更好的替代課程設計(目前的設計是從我在C++課程中學到的東西改編而來)?你會如何處理這個問題?
編輯:給大家指點我的STL容器:我知道它們的存在。但是,我不能在所有情況下使用這些數據,因爲我需要處理的數據量通常很大。這裏的想法是實現一個簡單的容器,它使用磁盤作爲存儲而不是內存。
哦gawd ... C++已經*有*容器和迭代器的概念。如果你與之一起玩,你將能夠真正使用第三方代碼!不要重新發明輪子。特別是當你的車輪會變成越野車時,效率低下且難以使用。 – jalf 2009-12-11 11:40:39
「一個使用磁盤作爲存儲的簡單容器」我們已經有了 - 它們被稱爲文件。迭代器對於文件的接口並不是那麼明智,但如果你需要它們,標準也提供了這一點。 – 2009-12-11 12:05:32