回答
如果容器的状态是类的不变量的一部分,那么它应该在可能的情况下是私有的。
例如,如果容器表示三维向量,那么不变量的一部分可能是它总是包含3个数字。将它公开为公共成员将允许类外部的代码更改容器大小,这反过来可能会导致需要容器大小不变的任何例程出现问题。保持容器的私密性,限制软件中容器大小可以修改为类的成员函数的地方。
一个成员是否被宣布私人或公众完全取决于你的应用程序。你能否提供更多细节?
声明你的成员时要记住的一点很重要,如果你提供一个“getter”来检索它,那么你就不再封装那个对象。相反,编写包装方法会很好,只会暴露您想要公开的功能。
例如,对于Vector成员,如果这是您希望公开的所有功能,则可以编写AddItem和Clear方法。
使所有成员保持私有状态并使用访问方法,这允许您稍后更改实现。只有在非常不寻常的情况下,我才会公开任何数据成员。
请记住,chaning实现发生的次数比您想象的要多,它不仅仅是更改容器类型的一种情况,也许您想更改机制。假设您将名称存储在列表中,过了一段时间,您可能选择使用散列索引此列表,并希望每次添加新名称时都更新散列。如果你的实现被适当的封装,这样做很容易,如果你刚刚暴露了矢量,你需要进行修改来调整接口(所以变化会波及)。
如果这是新新的,你有一个读:http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)
还有第三种办法 - 有时是更好地从容器中继承和重写它的方法来实现自己的目标(例如线程安全) 。无论如何,将其公开几乎总是不是一个好主意。
STL容器没有虚拟析构函数或虚方法,所以这可能是危险的领域。 – bk1e 2008-10-15 06:13:21
考虑到您希望将容器封装在另一个类中,这意味着它不能公开,并且您的类的公共方法不应公开任何有关容器的实现特定。这样,您的类(即容器)的实现可以在不更改其接口的情况下进行更改。
既然你在谈论一个班级,我认为它应该是私人的。如果你希望它是公开的,而不是创建一个结构体 - 显而易见,你希望使用成员变量。
公开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实现,因此这些成员变量的布局可能会有所不同!
- 1. 公共类,但私有成员变量?
- 2. 公共属性和私人成员C#
- 3. 私人和公共变量
- 4. 公共和私人访问为相同的成员函数
- 5. 公共/私人
- 6. 将成员从公共更改为私人
- 7. javadoc所有 - 私人,公共和受保护的成员
- 8. 如何设计一个C++类而不将std :: vector作为公共成员?
- 9. 设置一个公共属性作为私人
- 10. 作为私人成员的类类型,MVP?
- 11. 有没有办法从CoffeeScript类中的私人函数访问公共成员
- 12. 为什么要在课堂上为私人成员创建公共包装?
- 13. 与公共分配操作员私人复制ctor时出错
- 14. 如何访问私有包类的公共成员?
- 15. GitHub - 私人与公共合作伙伴
- 16. 选择一个功能的成员,非会员,私人,公共等
- 17. 如何让基础班的私人成员成为儿童班的公共成员?
- 18. 推送私人或公共?
- 19. 私人和公共职能
- 20. 私人与公共继承
- 21. 私人/公共qt信号
- 22. 私人与公共港口
- 23. 数组作为类的私有成员
- 24. C#继承私有类和公共成员
- 25. 私人非const和公共const成员函数 - 和平共存吗?
- 26. R中的私人成员引用类
- 27. Java可能有私人类和公共变量?
- 28. 2D矢量指针作为类的成员
- 29. 将所有成员的私人或公共接入模式的Java
- 30. 以编程方式将变量从公共更改为私人
闻起来像功课... – JohnMcG 2008-10-13 13:43:13