我有两个简单的类可以处理3d几何Point
和Vector
。它们都具有3个坐标作为公共成员变量,并定义了一些运算符,例如+, -, * ...
。
class Point
{
public:
double x, y, z;
// ctor and some operators
}
class Vector
{
public:
double x, y, z;
// ctor and some operators
}
是否有反对将Coordiantes公开的真正论点?
我永远不会将double
更改为任何其他类型。我不想将x, y, z
的值限制在一个特殊的范围内,并且我不想在设置坐标时进行任何检查。
这些类在一个库中,其他项目将使用这些库。
更新:
对我来说,setter / getter的一大缺点是必须编写/读取如下代码:
myVec.setX(myVec.x() + 1.0);
而不是
myVec.x += 1.0;
Upadate 2:
Qt uses getters/setters in QPoint but with no benefit
答案 0 :(得分:3)
乍一看似乎没有明显的优势来限制班级成员的可见性,但将来可能会发生这种情况。
例如,如果在将来的扩展中要向其值取决于x,y,...值的类添加一些属性,则将它们放在私有作用域中将非常有价值,因此可以自动重新计算。
此外,正如@vandensh所建议的那样,通过“ getters”和“ setters”访问数据成员也可以帮助检测非法值(请参见std::isnan)。
没有一个明确的答案,这实际上取决于用例。
答案 1 :(得分:3)
在C ++中,如果仅符合Uniform Access Principle,我将添加setter和getter。为什么调用者必须跟踪存储的内容和计算的内容?
对于基本数据类型,唯一不变的是范围,我会很高兴地承认,付出额外的努力可能不值得。但是像范围类型(具有.high,.low,.distance)之类的东西,要保持不变(hight> = low,距离= high-low),则这是必需的。否则,所有类型的客户端最终都必须维护该类型本身的不变性。