C ++:设计包含许多容器的类的接口

时间:2010-12-05 23:07:51

标签: c++ class containers naming

我找不到任何相关的内容,但如果已经提出这个问题,我很抱歉。我有时发现自己处于一种情境中,我有一个类,内部包含两个不同的容器。如下所示:

class Foo
{
  public:
    typedef std::vector<int> int_list;
    typedef std::vector<X> x_list;

    // It would be nice if the user could iterate through these etc. so that I
    // could define functions that operate on them as non-member non-friends.

    typedef int_list::size_type int_list_size_type;
    typedef int_list::const_iterator int_list_const_iter;

    typedef x_list::size_type x_list_size_type;
    typedef x_list::const_iterator x_list_const_iter;

    int_list_const_iter int_list begin() const { return ints_.begin(); }
    x_list_const_iter begin() const { return xs_.begin(); }

    int_list::size_type size_of_ints() const { return ints_.size(); }
    x_list::size_type size_of_xs() const { return xs_.size(); }

    // And so forth ... !

  private:
    int_list ints_;
    x_list xs_;
};

不知怎的,我感到不安。这是做我正在做的事情的聪明方式吗?基本上,对于每个容器我都需要typedef和(const重载)开始和结束方法等。我很好奇:你设计界面的方式是什么,命名typedef等?我想我基本上担心界面和方法的爆炸性,它看起来也有点难看。

也许限制开始/结束方法数量的一种方法是使用某种标签的基于模板的方法,但我不确定这是否合理。

谢谢!

3 个答案:

答案 0 :(得分:4)

听起来你的班级做得太多了。如果您的客户端需要对这些容器执行所有这些操作,那么最好只是公开对容器本身的常量引用,而不是尝试自己包装每个STL接口。

另一方面,如果你的客户需要做所有这些事情,那可能表明这个类需要被拆分成更小的类。

答案 1 :(得分:0)

你真的试过这个吗?你的代码不会编译。你不能拥有两个具有相同名称/参数列表的函数来返回不同的东西。

至于意图......你的疑虑是恰当的,你的班级可能没有做足够的工作来保证它的存在。事实上,您希望公开对象的完整内部,以便客户可以对它们进行操作,这使我得出结论,您的类几乎肯定是100%无用的。这是一个设计问题,你的疑虑只是你的鼻子告诉你一些臭味。

答案 2 :(得分:0)

您不应该允许访问容器。您应该导出类的功能,并且该类应该具有中心点。假设班级正在使用容器,例如int是引用X的键,您可能需要一个协调访问的接口。在这种情况下,您不应提供对底层容器的访问。