c++ - 允许访问 C++ 中的容器对象

标签 c++

我有一个像下面这样的类:

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 或将集合包装到 unmodifiableCollection 中。

最佳答案

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

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;
};

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

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

关于c++ - 允许访问 C++ 中的容器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11110486/

相关文章:

c++ - 在 SWIG 中将结构从 C++ 函数返回到 Python

c++ - 为什么 gcc 和 clang 会为 std::find 生成这么多代码?

c++ - 双指针操作

c++ - 奇怪的错误 c2660 "function does not take 1 arguments"

c++ - 将 unique_ptr 转换为 void* 并返回,我需要释放吗?

c++ - 使用 _Ropen 打开物理文件时出错

c++ - Objective-c中的class + (void)method与c++中的scope operator::的比较

c++ - 将递归函数转换为尾递归函数

c++ - 信号与信号2

c++ - 为什么 C++ 标准不更改 std::set 以使用 std::less<> 作为其默认模板参数?