首选的C ++样式是什么,使用get
和set
函数来获取和设置成员变量的值,或者只是将成员变量公开?
class MyClass
{
public:
std::string getValue();
std::string setValue();
private:
std::string value;
};
与
class MyClass
{
public:
std::string value;
};
第二个看起来比较干净,我看不出第一个有什么好处,除非你通过代码行付钱给你多一点钱。
答案 0 :(得分:4)
“展示”对象对世界的勇气是不好的做法。可能以后您可能想要更改类实现,甚至不能使值成为std::string
。
随着项目的发展,许多事情都会发生变化,当然,您可以稍后添加getValue
,但在这种情况下,您要弃用旧的“API”并创建新的,这可能会导致更新和等等。
此外,使 public 成员允许用户读取/修改此成员,而无需通知类本身。这可能会造成“糟糕的设计”问题。
答案 1 :(得分:4)
我认为第一个没有任何优势,除非你通过代码行获得更多的钱。
通过这种推理,第二种方法可能会给你更多的钱,考虑到维护成本。
想象一下,有一天你会改变value
来计算其他成员。使用getter可以轻松添加此行为,而不会影响代码库。
每个实例中存储string
值的事实应该是实现细节,而不是公开可见API的一部分(至少在理论上如此:没有继承,成员存在的事实是可见的)任何用户)。必须编写样板吸气剂和制定者是令人讨厌的,但从长远来看,这是值得的。
通常,具有太多setter和getter对的类具有其他设计缺陷并且通常具有太多可变状态。此外,在C ++中,如果具有数千个getter / setter对的类只保持状态并且根本不定义任何行为,那么它应该是struct
。
答案 2 :(得分:1)
公共类成员反对封装,这是OO原则之一。
最常见的约定是不使用单词get和set,只使用变量名。我们只是让编译器决定是否设置或通过参数的存在或其缺席来获取。
成员变量应以前缀“m_”开头。
其他选项是使用大写字母启动函数名称,使用常规函数启动变量。
许多开源库(如ImageMagick等)使用此约定。
您的课程应如下:
class MyClass
{
public:
void value(const std::string& v){
m_value=v;
}
const std::string& value()const {
return m_value;
}
private:
std::string m_value;
};