header 或 .cpp 中 class 变量的 C++ 声明?

C++ Declaration of class variables in header or .cpp?

到目前为止,我一直按以下方式使用 classes:

GameEngine.h 声明 class 如下

class GameEngine {
public:
    // Declaration of constructor and public methods

private:
    InputManager inputManager;
    int a, b, c;

    // Declaration of private methods
};

我的 GameEngine.cpp 文件然后只实现这些方法

#include "____.h"    
GameEngine::GameEngine() {

}

void GameEngine::run() {
    // stuff
}

但是,我最近读到变量声明不应该在 header 文件中。在上面的示例中,这将是一个 inputManager 和 a, b, c.

现在,我一直在寻找放置变量声明的位置,我找到的最接近的答案是:Variable declaration in a header file

但是,我不确定在这里使用 extern 是否有意义;我只是声明了仅在 class 本身的实例中使用的私有变量。 header 文件中的变量声明是否正常?还是我应该把它们放在别处?如果我应该将它们放在 cpp 文件中,它们会直接放在#include 下吗?

Class成员变量必须在class定义中声明,通常在头文件中。这应该在没有任何 extern 关键字的情况下完成,完全正常,就像您到目前为止所做的那样。

只有 不是 class 成员且需要在头文件中声明的变量才应声明 extern.

一般规则:

要在同一个 class 中与许多函数一起使用的变量放在 class 声明中。

各个函数的临时变量放在函数本身中。

似乎 InputManager inputManager; 属于 class header。

int a, b, c; 从这里很难知道。它们的用途是什么?它们看起来 像临时变量,在它们使用的函数中会更好,但如果没有适当的上下文我不能肯定地说。

extern在这里没有用。

不要将类型的成员与变量混淆。 class/struct 定义只是描述什么构成了类型,而没有实际声明任何变量的存在,任何要在内存上构造的东西,任何 addressable.

在传统意义上,现代 class 设计实践建议您假装它们是 "black boxes":东西进去,它们可以执行某些任务,也许会输出一些其他信息。我们一直使用 class 方法来执行此操作,在 .h/.hpp/.hxx 文件中简要描述它们的 signature 并将实现细节隐藏在 .cpp/ 中。 cc/.cxx 文件。

虽然同样的理念可以应用于成员,但 C++ 的当前状态、翻译单元如何单独编译使得这种方式更难实现。这里肯定没有任何 "out of the box" 可以帮助您。基本的根本问题是,对于几乎所有要使用 class 的东西,它都需要知道以字节为单位的大小,这是受成员字段和声明顺序限制的。即使它们是私有的并且类型范围之外的任何东西都不能操纵它们,它们仍然需要简要地知道它们是什么。

如果您真的想向外人隐藏此信息,某些习惯用法(例如 PImpl 和内联 PImpl)可以提供帮助。但我建议你不要走这条路,除非你真的是:

  1. 编写具有 semi-stable ABI 的库,即使您进行了大量更改。
  2. 需要隐藏non-portable、platform-specific代码。
  3. 由于大量包含,需要减少 pre-processor 次。
  4. 需要减少受此信息公开直接影响的编译时间。

指南实际上是在谈论永远不要在 header 中声明全局变量。任何利用您的 header 的翻译单元,即使是间接的,最终也会根据 header 指令声明其自己的全局变量。单独检查时一切都会编译得很好,但链接器会抱怨你对同一事物有多个定义(这在 C++ 中是一个很大的 no-no)

如果您需要保留内存/构造某些东西并将其绑定到变量的名称,请始终尝试在源文件中实现这一点。