【发布时间】:2011-10-13 04:34:21
【问题描述】:
class X {
public:
typedef std::list<int> Container;
// (1)
const Container& GetElements() const;
// (2)
Container::iterator ElementBegin();
Container::iterator ElementEnd();
// (3)
CustomIterator GetElementIterator();
private:
Container m_container;
};
我正在寻找一种一致且干净的方式来为调用者提供封装容器的迭代器。我想出了上面源代码中标记的三个想法。
- 提供 size()、begin() 和 end(),所有这些都非常适合读取访问。但是,由于返回的
Container引用是 const,您将只能使用const_iterator。返回引用非常量是不好的,因为容器本身可以被修改(例如clear())。 - 提供对元素的非常量访问,但是我们通常需要一个自己的
size()方法(如GetElementCount())。可以使用iterator::distance(),但对于某些容器来说可能效率低下(其中operator++/--被反复调用以计算距离)。 - 提供带有
next()等方法的自定义迭代器。仍然需要自己的size()方法。
我敢打赌有更好的解决方案,所以如果你知道的话,我会很高兴看到它们。
【问题讨论】:
-
如果你想从容器中暴露几乎任何东西,为什么不继承它,而不是封装它呢?
-
@Sander De Dyker:因为我不想以任何方式扩展容器(无论如何,STL containere 并不意味着派生)。甚至有可能在一个类中存在多个容器,例如
X之一。 -
在一般情况下确实不是一个好主意。但在特定情况下,它可能很有用(假设您知道自己在做什么)。这似乎是一个有争议的问题,因为它不适用于这里。