我目前正在一个项目中,我想定义一个通用的'集合'接口,可能以不同的方式实现。集合接口应该指定集合具有按值返回迭代器的方法。使用类,包装指针我想出了以下(大大简化):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