gpt4 book ai didi

c++ - setter / getter 和分层数据结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:22 27 4
gpt4 key购买 nike

我知道在您的类(class)中拥有公共(public)领域被认为是一个坏主意。但是,当您的类包含大量分层数据结构和字段时,最好的方法是什么?例如:

class A {B d1; C d2; D d3;}
class B {E d4; F d5;}
class E {G d6; int d7;}

在 C 中很容易访问这样的数据结构,例如ptr_to_A->d1.d4.d7 等等...但是当我们使用 setters/getters 时,方法是什么?

在 C++ 中使用 setter 和 getter 时,像 A.get_d1().get_d4().get_d7() 这样的表达式看起来不太方便,它们会强制返回引用。由于某些结构非常大,按值返回似乎是个糟糕的主意。

在这些情况下,您使用哪种方法或编码风格?也许摆脱 setter/getter 并公开这些字段?

最佳答案

I know it is considered a bad idea to have public fields in your class.

这是对过去十年 Java 开发的概括性陈述。您应该逐个考虑成员应该是公共(public)成员还是私有(private)成员。有时公共(public)数据成员是正确的想法。考虑以下问题:

  1. 我需要维护这个成员的不变性吗?
  2. 该成员的值是否无效?
  3. 我是否希望界面提供此成员的替代表示?

如果以上任何一个问题的答案是肯定的,您可能想要使用 setter/getter 。

还要考虑单独设置成员是否真的有意义。也许您应该使用构造函数设置成员,并且您希望提供一些其他接口(interface)来修改这些成员。

When using setters and getters in C++, expressions like A.get_d1().get_d4().get_d7() don't seem convenient

虽然具有相当深的数据结构嵌套并不少见,但通常一段特定的代码不必深入研究它。如果是这样,我想它可能做的比它应该做的更多,超出了它的单一职责。但是,如果从 A 对象获取 d7 是一项常见任务,也许 A 应该在其接口(interface)中公开它:

int A::get_d7 {
return get_d1().get_d4().get_d7();
}

Since some structures are pretty big, returning by value seems a terrible idea.

实际上,对于现代 C++,这根本不是问题。按值传递应被视为对象传递的默认模式。这是因为现在可以移动临时对象,这本质上是一种非常有效的复制形式。

关于c++ - setter / getter 和分层数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15689712/

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