2008-10-13 73 views

回答

1

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

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

1

一个成员是否被宣布私人或公众完全取决于你的应用程序。你能否提供更多细节?

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

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

0

使所有成员保持私有状态并使用访问方法,这允许您稍后更改实现。只有在非常不寻常的情况下,我才会公开任何数据成员。

请记住,chaning实现发生的次数比您想象的要多,它不仅仅是更改容器类型的一种情况,也许您想更改机制。假设您将名称存储在列表中,过了一段时间,您可能选择使用散列索引此列表,并希望每次添加新名称时都更新散列。如果你的实现被适当的封装,这样做很容易,如果你刚刚暴露了矢量,你需要进行修改来调整接口(所以变化会波及)。

如果这是新新的,你有一个读:http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

0

还有第三种办法 - 有时是更好地从容器中继承和重写它的方法来实现自己的目标(例如线程安全) 。无论如何,将其公开几乎总是不是一个好主意。

+0

STL容器没有虚拟析构函数或虚方法,所以这可能是危险的领域。 – bk1e 2008-10-15 06:13:21

0

考虑到您希望将容器封装在另一个类中,这意味着它不能公开,并且您的类的公共方法不应公开任何有关容器的实现特定。这样,您的类(即容器)的实现可以在不更改其接口的情况下进行更改。

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实现,因此这些成员变量的布局可能会有所不同!