gpt4 book ai didi

C++ Getter/Setter(备选方案?)

转载 作者:可可西里 更新时间:2023-11-01 18:40:45 27 4
gpt4 key购买 nike

好吧,几乎在我读到的所有地方,我都读到 getter/setter 是“邪恶的”。现在,作为一个经常在 PHP/C# 中使用 getters/setters 的程序员,我看不出它们是如何活着的。我读到它们破坏了封装等,但是,这是一个简单的例子。

class Armor{

int armorValue;
public:
Armor();
Armor(int); //int here represents armor value
int GetArmorValue();
void SetArmorValue(int);
};

现在,假设 getter 和 setter 是“邪恶的”。你应该如何在初始化后更改成员变量。

例子:

Armor arm=Armor(128); //armor with 128 armor value

//for some reason I would like to change this armor value
arm.SetArmorValue(55); //if i do not use getters / setters how is this possible?

无论出于何种原因,我们都可以说以上内容不正确。如果我的游戏将护甲值限制在 1 到 500 之间怎么办?(任何护甲都不能有超过 500 护甲或少于 1 护甲的部件)。

现在我的实现变成了

void Armor::SetArmor(int tArmValue){
if (tArmValue>=1 && tArmValue<=500)
armorValue=tArmValue;
else
armorValue=1;
}

那么,在不使用 getter/setter 的情况下,我还能如何施加此限制?如果不使用 getter/setter,我还能如何修改属性?在情况 1 中 armorValue 应该只是一个公共(public)成员变量,而在情况 2 中使用 getters/setters 吗?

好奇。谢谢大家

最佳答案

你误会了什么。 使用 getters/setters 会破坏封装并暴露实现细节,对于邪恶的某些定义,可以将其视为“邪恶”。

我想它们在某种意义上可以被认为是邪恶的,因为如果没有适当的 IDE/编辑器支持,用 C++ 编写它们有些乏味......

C++ 的一个缺陷是创建非常量引用 getter,这也允许修改。这相当于返回一个指向内部数据的指针,并且会锁定内部实现的那部分,实际上并不比公开字段好。

编辑:根据评论和其他答案,您听到的可能是指总是每个 字段创建非私有(private)getter 和setter。但我也不会称之为邪恶,只是愚蠢;-)

关于C++ Getter/Setter(备选方案?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14539838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com