访问者与公共成员

时间:2009-03-22 12:54:56

标签: c++ class member

我有一个类,其中包含许多具有读/写访问权限的内置类型成员。我应该让他们成为公共成员并为每个成员提供获取/设置方法吗?结构怎么样?

5 个答案:

答案 0 :(得分:19)

拥有访问器(getter)和修饰符(setter)的全部原因是为自己提供额外的间接级别。

这种额外的间接级别允许您向公共接口提供变量的只读视图,同时不允许更改数据成员。您仍然可以使用私有或受保护的setter。

Setters允许您在设置值时执行特殊错误检查,验证和更正。例如setDirectory(const std :: string& strPath),如果用户没有指定,则可以确保存在终止斜杠。这可确保您的班级状态始终有效。

Getters还可以保护您的成员不会暴露它们以允许指向它们。通过不允许从外部指向它们,您可以确保如果您的对象超出范围,它将不会导致崩溃。

getter / setter的额外间接级别还允许您更改它们封装的数据成员。

使用getter,您还可以获得不同的数据视图,例如:getMinutes,当您的数据成员实际存储在几秒钟内时。

这不是使用它们的原因,但使用getter和setter的一个很好的副作用是你可以在修饰符中设置一个断点,例如看看它何时被改变。

是否应该使用它们是根据您的需要进行的判断。如果您有这么多成员,那么提供getter和设置是一件非常痛苦的事情,您可以考虑将数据成员存储在结构中并在类中使用该结构。您甚至可以立即为整个结构的对象提供getter / setter。

答案 1 :(得分:13)

如果您需要保留invariants,那么是。否则,不要打扰。

答案 2 :(得分:4)

首先,如果你的班级有很多数据成员,那么可能没有很好的设计。您可能需要考虑将其拆分为多个类或将数据存储在诸如map之类的结构中。

关于提供访问者,问题是您是否希望修改访问权限,可能会阻止访问权限。如果答案是肯定的,那么您需要访问功能。另一方面,如果你的班级真的只是一大堆,没有任何行为,那么就把它变成一个结构。

答案 3 :(得分:1)

您应该只使用公共数据成员

  • 在结构中,你没有暴露给客户端代码(例如绑定式仿函数) - 保护外面没有人会得到的结构是没用的
  • 如果他们的类型封装了set / getting它们的逻辑(例如,如果你创建了一个ObservableAttribute类)
  • 如果他们是不可变结构中的const成员(除非他们是不可变的,否则你不能做很多事情)

如果您创建公共数据成员,则必须确保其值与该类的其他成员完全正交。例如,你禁用了

的未来可能性
  • 观察对会员的更改
  • 让会员在班级'invariant
  • 中扮演任何角色
  • 禁止访问该成员
  • 如果性能需要,可以更改成员的实现(例如,计算与缓存与存储)

答案 4 :(得分:0)

对私有/受保护数据成员使用get / set方法是一个糟糕的设计。

它会导致客户端代码依赖于您的类的实现细节。

班级中的更改会导致客户端代码发生变化。

但是,可以使用公共成员的get / set方法。但避免它们总是好的。