4

我知道类中的数据应该是私有的,然后使用 getter 和 setter 来读取/修改它们。student.scores.push_back(100)但是比起直接使用省了一个成员函数是不是很麻烦。

class Student {
public:

    void addToScores(int inScore) {

        scores.push_back(inScore);
    }

private:

    vector<int> scores;
}

简而言之,我很好奇人们在实践中实际做了什么,总是严格使用 getter 和 setter 的私有数据?

4

4 回答 4

4

成员函数的目的是公开一个接口。无需制作 getter 和 setter 或其他琐碎的函数,只需将成员已实现的接口移动到聚合容器对象。

如果Student应该允许客户随意操作scores,您应该创建scores一个公共成员并以简单的方式访问它。如果它应该是只有pushpop和的堆栈top,则使用std::stack接口适配器。如果只push_back允许,那么您可以实施addToScores. 但是,如果唯一的客户是您,并且您不担心std::vector接口的其他部分被滥用,那么实现新接口确实没有意义。

程序中的每个界面都应该经过深思熟虑的设计。由于标准接口(包括 C++ 默认赋值运算符)是“危险的”,因此添加 slapdash 接口作为一种习惯并不一定是一个好习惯。

于 2013-04-13T04:51:20.840 回答
2

在实践中,人们使用类来定义具有独立于其数据成员的新语义的新数据类型。既不使用访问器也不使用公共数据成员,而是提供成员函数来执行与新数据类型相关的任务,同时保持数据成员的不变量。

当然,有时人们编写的类只是数据的聚合,没有额外的语义。在这种情况下,一个struct填充公共成员是合适的。

于 2013-04-13T04:40:32.803 回答
2

使用 Get/Set 方法的基本原因之一是控制数据封装之外的输入类型。

如果您不想采用某些特定的输入类型,假设您可能不希望得分超出 [0,100] 区间的范围,那么您可以在 Set 方法中检查此条件,以便库用户无法进行不合逻辑的操作。

于 2013-04-13T08:31:58.707 回答
0

如果它是简单的读/写,您实际上不必将数据设为私有。但是,如果您需要对正在读取/写入的数据进行验证/条件,那么将其设为私有是有意义的。

于 2013-04-13T04:50:56.780 回答