将数据成员放入结构中?

Putting data members inside a struct?

我正在更新一些旧的未维护软件,我注意到一个我无法充分解释的特殊模式。

有问题的代码是用 C++ 编写的。通常当我看到数据成员时,它们作为 public 或私有成员存在于 class 声明中。在我目前使用的代码中,几乎每个 class 都将数据成员存储在一个附加结构中,如下所示:

struct MyClassData {
    int foo;
    int bar;
};

class MyClass {
    MyClassData classData;

public:
    void doFoo();
    void doBar();
    void doBaz();
};

不幸的是,无法联系到此代码的原始维护者。不过,每个 class(大约有一百个)都这样做。我不明白为什么,因为 MyClassData 结构从未在 class 声明顶部以外的任何地方使用过。

有人会选择以这种方式布局他们的 C++ classes 有什么特别的原因吗?我知道想要和使用结构作为数据成员是有原因的,但我不明白的是为什么你想要将 all 你的数据成员填充到一个结构中,比如这个,并且永远不要对该结构做任何其他事情。我想它可能会消除关于您在方法中访问什么以及如何访问的任何歧义(因为所有内容都需要先通过 classData),但除此之外,我不知道。我想知道是否存在我尚未发现的技术原因。

这种不常见的模式没有满足特定的技术限制。

我能猜到作者的意图(虽然,最终,你不得不问他们):

  1. 对"encapsulation"
    概念的过度迷恋和误解 ("this way all the data is kept together!")

  2. 单独的序列化代码可以隔离引用类型而不必成为MyClass.

  3. 的友元
  4. MyClassData 是一个聚合(至少在这个例子中,它的所有成员都是 int)允许你以某些方便的方式初始化它。但是,如果您总是将它作为 MyClass 的一部分,我看不出您可以将其用于任何有意义的用途。

顺便说一句,就我个人而言,我会把它做成一个嵌套的 detail class if anything。在这里,很容易得到 MyClassData 而没有 MyClass,那有什么意义呢?不是很清楚。

在没有任何解释性评论或文档的情况下,并且鉴于无法联系到原作者,我不会太担心遵守这种模式。除了保持代码库一致或避免为自己创建大量重构工作的原则之外,我看不出有什么强烈的理由坚持它。