作为私人/公共会员的矢量类设计?

时间:2008-10-13 10:35:49

标签: c++ class-design encapsulation

将容器类或其他类放在类中作为私有或公共成员的最佳方法是什么?

要求:

1.Vector< SomeClass的>在我的课堂内

2.添加和计数向量是必需的接口

6 个答案:

答案 0 :(得分:1)

成员是否被声明为私有或公共完全取决于您的应用程序。你能提供更多细节吗?

在声明你的成员时要记住的一个要点是,如果你提供一个“getter”来检索它,那么你就不再封装那个对象了。相反,编写仅暴露您希望公开的功能的包装器方法会很好。

例如,对于Vector成员,您可以编写AddItem和Clear方法,如果这是您希望公开的所有功能。

答案 1 :(得分:1)

既然你在谈论课程,我认为它应该是私密的。如果您希望它是公共的,而是创建一个结构 - 显然您希望使用成员变量。

公开vector成员的可行替代方法是创建访问者函数(或内部迭代器)。这样你就更好地遵守得墨忒耳的法则了:

class ContWrapper {
    std::vector<int> _ints;
public:
    class Action {
    public: 
        virtual void accept( int i ) = 0;
    };
    void each_int( Action& a );
};

出口时也要非常小心,例如来自库的std::vector<T>:客户端代码可能不会使用与您相同的STL实现,因此这些成员变量的布局可能会有所不同!

答案 2 :(得分:1)

如果容器的状态是类的不变量的一部分,那么它应该是私有的。

例如,如果容器表示三维向量,则不变量的一部分可能是它总是包含正好3个数字。将其公开为公共成员将允许类外部的代码更改容器大小,这反过来可能导致需要容器大小恒定的任何例程的问题。保持容器的私密性限制了软件中容器大小可以修改为类成员函数的位置。

答案 3 :(得分:0)

将所有成员设为私有并使用访问器方法,这允许您稍后更改实现。只有在非常特殊的情况下才能公开任何数据成员。

请记住,实施的过程比您想象的更频繁,它不仅仅是更改容器类型的情况,而且您可能想要更改机制。假设您将名称存储在列表中,过了一段时间,您可能会选择使用哈希对此列表编制索引,并希望每次添加新名称时都更新哈希值。如果您的实现被适当地封装,这很容易,如果您刚刚暴​​露了向量,则需要进行更改以调整接口(因此更改将会消失)。

如果这是新手,请阅读:http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

答案 4 :(得分:0)

还有第三种方式 - 有时候最好从容器继承并覆盖它的方法来实现你的目标(例如线程安全)。无论如何,将它公开几乎总是不是一个好主意。

答案 5 :(得分:0)

考虑到您希望将容器封装在另一个类中意味着它不能是公共的,并且您的类的公共方法也不应该暴露任何特定于实现的容器。这样,可以在不改变其界面的情况下更改类(即容器)的实现。