在简单的Point类中,是否有用于getter / setter的真正参数,而不是public成员变量?

时间:2018-12-15 17:58:35

标签: c++

我有两个简单的类可以处理3d几何PointVector。它们都具有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

2 个答案:

答案 0 :(得分:3)

乍一看似乎没有明显的优势来限制班级成员的可见性,但将来可能会发生这种情况。

例如,如果在将来的扩展中要向其值取决于x,y,...值的类添加一些属性,则将它们放在私有作用域中将非常有价值,因此可以自动重新计算。

此外,正如@vandensh所建议的那样,通过“ getters”和“ setters”访问数据成员也可以帮助检测非法值(请参见std::isnan)。

没有一个明确的答案,这实际上取决于用例。

答案 1 :(得分:3)

在C ++中,如果仅符合Uniform Access Principle,我将添加setter和getter。为什么调用者必须跟踪存储的内容和计算的内容?

对于基本数据类型,唯一不变的是范围,我会很高兴地承认,付出额外的努力可能不值得。但是像范围类型(​​具有.high,.low,.distance)之类的东西,要保持不变(hight> = low,距离= high-low),则这是必需的。否则,所有类型的客户端最终都必须维护该类型本身的不变性。