首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >引用类成员而不是getter

引用类成员而不是getter
EN

Stack Overflow用户
提问于 2017-04-13 12:12:54
回答 1查看 163关注 0票数 2

获得类成员或其值的引用的经典方法,我们使用像getValue()这样的getter。这会是另一种方式吗?

代码语言:javascript
运行
复制
class A{
  ComplexClass value_;
public:
  //No need. ComplexClass const& getValue() const { return value_; }
  ComplexClass const& value = value_;   /// ???
}

这个能行吗?你喜欢这样的语法吗?

UPD.这一点是为了使用户代码更简单。就我个人而言,我更喜欢auto x = a.value而不是auto x = a.getValue()。当然,这是一种品味。

如果:

代码语言:javascript
运行
复制
class A{
public:
  ComplexClass const& value = value_;
protected:
  ComplexClass value_;
}

我问这个问题是因为我遇到了一个编译器的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 12:34:04

与数据成员相比,更喜欢成员函数的主要原因之一是灵活性和可维护性。如果您只编写了一次完美的代码,并且它永远不会被更改或重用,那么您当然可以拥有用户直接引用的公共数据成员。

有趣的问题是,当您的代码不符合这些标准时会发生什么,例如,它是否要进化,以及其他人是否开始使用它。然后,一旦您有了一个公共数据成员,您将被迫始终拥有该数据成员。您的类布局的细节现在是您的公共契约的一部分。简单的重构,比如将公共部分移动到嵌套的成员对象中,不再是私有的,并且破坏了现有的用户。

建议的引用数据成员几乎不会比公共数据成员增加任何好处(除了在非常琐碎的情况下),并且与成员函数不同,非静态数据成员会影响类布局。类布局是另一件事,一旦您有了用户,您可能希望保持稳定,以便旧的编译库可以继续与新的用户代码链接。在保持数据布局不变的同时,成员函数更容易进化。

在标准库中有一个很好的例子,其中出现了这样一个错误:std::pair<T1, T2>被指定包含公共数据成员firstsecond。这意味着所有的用户专门化必须遵守相同的规范,并且不能轻易地使用诸如基本布局优化之类的东西。如果将firstsecond指定为成员函数,则此类优化可以简单地应用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43392033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档