只读类成员C++
read only class member C++
我有点困惑,我读到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;
}
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 我们可以访问一个不存在的联盟的成员吗