缺少C ++访问器的约定?

时间:2013-07-18 13:47:19

标签: c++ class coding-style getter-setter

我已经阅读了关于3 different conventions for accessor methods的社区维基查询,并且看到以下约定并不令人惊讶:

const unsigned& amount() const { return _amount; }
unsigned& amount() { return _amount; }

是的,它与无缝完全不同,因为能够完全避免括号() - 这会(我觉得)是想法 - 但它仍然是某种东西;正确?

3 个答案:

答案 0 :(得分:8)

它破坏了访问者的目的。如果你提供两个 函数,你也可以将数据成员公之于众 完成它。

编辑:

只是为了让事情变得非常明确: 案例在哪里 使用C样式struct是最合适的解决方案。在 这些情况下,您将数据成员公开,不要担心 关于访问者。对于具有重要行为的类,在 另一方面,你根本不会有访问者,或者很少。对于 大多数情况下,内部状态直接反映在 公共接口(以及通常读取的状态) 只要)。关于你唯一需要访问器的时间是 类基本上是数据,但必须强制执行 数据中的不变量,

(以及它的价值:如果数据在逻辑上是一个属性 在课堂上,我用:

int amount() const { return myAmount; }
void amount( int newValue ) { myAmount = newValue; }

对于不具有逻辑属性的值的getter, 但是,我会使用getAmount()。)

答案 1 :(得分:2)

您的第二个示例允许用户访问类中的原始_amount,而不受类本身的任何形式的保护。 “封装”的目的,是OOP的一个重要方面,是确保对变量的所有访问都在类本身内完成 - 这样类可以控制值范围或其他有效性。

如果您希望该类透明地允许用户使用amount,请将其命名为amount并将其公开。那时就不需要访问器功能了。

答案 2 :(得分:0)

这个问题是它可能会破坏getter / setter约定的目的。如果你将一个可变引用传递给私有成员,你也可以公开该成员并消除函数调用的麻烦。

另外,我发现这种语法非常难看且不可读,但这是我的个人品味:

foo.amount() = 23;
相关问题