2

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

要求:

1.Vector< someclass> 在我的班级里

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

4

6 回答 6

1

成员是声明为 Private 还是 Public 完全取决于您的应用程序。你能提供更多细节吗?

声明成员时要记住的重要一点是,如果您提供“getter”来检索它,那么您将不再封装该对象。相反,最好编写只公开您希望公开的功能的包装器方法。

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

于 2008-10-13T10:39:29.657 回答
1

既然你在谈论一个类,我认为它应该是私有的。如果您希望它公开,请创建一个结构 - 以明确您希望使用成员变量。

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

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

在从库中导出例如 an 时也要非常小心std::vector<T>:客户端代码可能与您使用的 STL 实现不同,因此这些成员变量的布局可能不同!

于 2008-10-13T10:57:23.257 回答
1

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

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

于 2008-10-13T12:48:57.447 回答
0

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

请记住,更改实现的频率比您想象的要多,这不仅是更改容器类型的情况,还可能是您想更改机制。假设您将名称存储在列表中,一段时间后您可能会选择使用散列索引此列表,并希望每次添加新名称时都更新散列。如果您的实现被适当地封装,这样做很容易,如果您刚刚公开了向量,则需要进行更改以调整界面(因此更改会产生涟漪)。

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

于 2008-10-13T10:44:18.027 回答
0

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

于 2008-10-13T10:44:25.060 回答
0

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

于 2008-10-13T10:44:41.020 回答