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

标签 c++

我知道在您的类(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/

相关文章:

c++ - 如何递归取消引用指针(C++03)?

c++ - 线程池实现 : condition_variables vs. yield()

c++ - 如果 head 在 main 中局部声明,链表的 void 递归反向函数的参数应该是什么?

c++ - 通过 const 引用传递动态数组结构

c++ - ATL on CUDA 出现编译错误

c++ - 如何从使用 for 循环中的 vector 大小的 vector 中删除元素

c++ - 在 Visual Studio 中导入 Dll

c++ - 除以零 : Undefined Behavior or Implementation Defined in C and/or C++?

c++ - 使用字母字符加密/解密 XOR

c++ - 可变参数模板函数:没有匹配的调用函数,std::endl