我有一个像下面这样的课程:
class Foo {
private:
std::map<std::string, Bar*> bars_by_name;
std::map<std::string, Baz*> bazs_by_name;
};
现在我想允许用户访问这两个集合,但隐藏我将对象存储到 std::maps 中的实现细节。相反,我想要返回例如的成员函数集合的 const 迭代器,甚至可能是从两个集合返回对象的自定义迭代器,因为 Bar 和 Baz 属于同一类层次结构。考虑到风格,在 C++ 中执行此操作的正确方法是什么?在 Java 中,我可能会将方法的返回类型设置为 Iterable 或将集合包装到不可修改的集合中。
您可以将集合的迭代器当作您自己的迭代器传递。
class Foo {
private:
typedef std::map<std::string, Bar*> BarContainer;
typedef std::map<std::string, Baz*> BazContainer;
public:
typedef BarContainer::const_iterator ConstBarIterator;
ConstBarIterator beginBars() { return bars_by_name.cbegin(); }
ConstBarIterator endBars() { return bars_by_name.cend(); }
typedef BazContainer::const_iterator ConstBazIterator;
ConstBazIterator beginBazs() { return bazs_by_name.cbegin(); }
ConstBazIterator endBazs() { return bazs_by_name.cend(); }
private:
BarContainer bars_by_name;
BazContainer bazs_by_name;
};
这节省了您实现自己的迭代器的工作,同时让您可以灵活地稍后更改容器类型,并且只需要调用者重新编译。
它并没有解决将它们一起迭代的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)