2013-04-13 60 views
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?

+0

尝试设计您的类接口,然后再考虑您的类可能具有哪些类型的数据成员。那么你不必问这个问题。 –

+1

没有人被迫写出体面的代码。相信我。 –

回答

4

成员函数的用途是公开一个接口。没有必要让getter和setter或其他简单的函数简单地将已经由成员实现的接口移动到聚合容器对象。

如果Student的客户端应该被允许操纵scores但是他们想要,您应该让scores成为公共成员并以简单的方式访问它。如果应该是只有push,poptop的堆栈,请使用std::stack接口适配器。如果只允许push_back,那么您可以实施addToScores。但是,如果唯一的客户是你,并且你不担心接口的其他部分被滥用,那么实现一个新的接口是没有意义的。

程序中的每个接口都应该精心设计。添加slapdash接口是一种习惯,因为标准接口(包括C++默认赋值运算符)是“危险的”并不一定是一个好习惯。

2

实际上,人们使用类来定义新的数据类型,并使用独立于数据成员的新语义。访问者和公共数据成员都不使用,而是提供成员函数来执行与新数据类型相关的任务,同时在数据成员上维护不变量。

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

0

如果它是一个简单的读/写,您并不需要使数据保密。但是,如果您需要对正在读取/写入的数据进行验证/条件检查,那么将其视为私有是有意义的。

2

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

如果你不想采取一些特定的输入类型,比如说你可能不想要一个超出[0,100]区间范围的分数,那么你可以在Set方法中检查这个条件,以便库用户不能一个不合逻辑的操作。

相关问题