允许在C++中访问容器对象

tsn*_*rri 6 c++

我有一个类似下面的类:

class Foo {
private:
    std::map<std::string, Bar*> bars_by_name;
    std::map<std::string, Baz*> bazs_by_name;
};
Run Code Online (Sandbox Code Playgroud)

现在我想允许用户访问两个集合,但隐藏我将对象存储到std :: maps中的实现细节.相反,我希望有成员函数返回例如集合的const迭代器,甚至可能是从两个集合返回对象的自定义迭代器,因为Bar和Baz属于同一个类层次结构.考虑到样式,在C++中执行此操作的正确方法是什么?在Java中,我可能会设置方法的返回类型为可迭代或包裹收集到unmodifiableCollection.

Adr*_*thy 1

您可以将集合的迭代器当作您自己的迭代器传递。

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;
};
Run Code Online (Sandbox Code Playgroud)

这节省了您实现自己的迭代器的工作,同时让您可以灵活地稍后更改容器类型,并且只需要调用者重新编译。

它并没有解决将它们一起迭代的问题。