只读类成员C++

read only class member C++

本文关键字:C++ 成员 只读      更新时间:2023-10-16

我有点困惑,我读到C++中使用getter和setter有一些缺点,尽管要创建只读变量,将变量设为私有并创建getter函数似乎是显而易见的做法。也许有一个简单的答案,我只是看不出来,但有什么更好的选择可以让成员变量在没有getter的情况下只读,或者使用getter函数来解决这个问题是可以接受的,甚至是好的解决方案?

a)提供getter和setter和/或b)公共数据属性

挫败了实现最佳耦合和内聚的软件工程目标。


来自维基百科:

在软件工程中,耦合是软件模块之间的相互依赖性;衡量距离有多近连接的两个例程或模块;模块之间的关系。联轴器通常与凝聚性

在计算机程序设计中,内聚是指模块的元素属于一起。[1] 因此,内聚力衡量内部功能块之间的关系强度给定模块。例如,在高度内聚的系统中,功能是强烈相关。


在过程编程中,(通常)有8个耦合级别(从最差到最好)。维基上的文章描述了所有这些。您的编码工作应该努力获得最佳耦合(标签为"none")。

(通常)有7个级别的凝聚力进行排名(从最差到最好)。你应该努力获得最好的凝聚力(带有"功能性"标签)。


考虑耦合的一种方法是,如果添加setter和getter或使用公共数据属性,为什么要麻烦将这些数据封装到这个类中?如果允许数据属性由代码的任何部分修改,那么考虑一下当需求更改迫使您更改数据属性的名称和/或类型时,非类代码可能需要更改多少。

关于内聚的类似想法——公共数据属性很容易被不相关的代码(另一个对象或外部函数中的代码)修改,是什么让它们成为类的一部分?也许这些"外部"代码应该是您对象的一部分。。。是与此对象为系统所做的主要"目标"相关的数据。

也许您可以使用对变量的常量引用。这是我唯一一次通过在只读私有变量前面加一个"_"来使用命名约定。

如果你只是在阅读参考变量,你也可以在整个类中使用它

#include <iostream>
#include <cmath>
using std::cout;
struct Vector2 {
    float X, Y;
    // this creates a const reference so you can only read from it
    const float& Magnitude = _Magnitude;
    
    Vector2(float x = 0.0f, float y = 0.0f): X(x), Y(y) {
        // when you need to write to it use the private variable
        _Magnitude = sqrt(
            X * X +
            Y * Y
        );
    }
    
private:
   float _Magnitude = 0.0f; 
};
int main() {
    
    Vector2 pos(10, 20);
    
    // reading the value is fine
    cout << pos.Magnitude << 'n';
    
    // writing to it will cause an error
    //pos.Magnitude = 6.0f;
    
}