我找不到任何相关的内容,但如果已经提出这个问题,我很抱歉。我有时发现自己处于一种情境中,我有一个类,内部包含两个不同的容器。如下所示:
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等?我想我基本上担心界面和方法的爆炸性,它看起来也有点难看。
也许限制开始/结束方法数量的一种方法是使用某种标签的基于模板的方法,但我不确定这是否合理。
谢谢!
答案 0 :(得分:4)
听起来你的班级做得太多了。如果您的客户端需要对这些容器执行所有这些操作,那么最好只是公开对容器本身的常量引用,而不是尝试自己包装每个STL接口。
另一方面,如果你的客户需要做所有这些事情,那可能表明这个类需要被拆分成更小的类。
答案 1 :(得分:0)
你真的试过这个吗?你的代码不会编译。你不能拥有两个具有相同名称/参数列表的函数来返回不同的东西。
至于意图......你的疑虑是恰当的,你的班级可能没有做足够的工作来保证它的存在。事实上,您希望公开对象的完整内部,以便客户可以对它们进行操作,这使我得出结论,您的类几乎肯定是100%无用的。这是一个设计问题,你的疑虑只是你的鼻子告诉你一些臭味。
答案 2 :(得分:0)
您不应该允许访问容器。您应该导出类的功能,并且该类应该具有中心点。假设班级正在使用容器,例如int是引用X的键,您可能需要一个协调访问的接口。在这种情况下,您不应提供对底层容器的访问。