C++标头或.cpp中的类变量声明?

Kef*_*fir 5 c++ header-files variable-declaration

到目前为止,我一直在使用以下方式的类:

GameEngine.h声明该类如下

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

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

    // Declaration of private methods
};
Run Code Online (Sandbox Code Playgroud)

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

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

}

void GameEngine::run() {
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

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

现在,我一直在寻找放置变量声明的位置,我找到的最接近的答案是:头文件中的变量声明

但是,我不确定extern的使用是否有意义; 我只是声明私有变量,它们只会在类本身的实例中使用.我的头文件中的变量声明是否正常?或者我应该把它们放在别处吗?如果我把它们放在cpp文件中,它们会直接进入#include吗?

Zal*_*nGG 7

不要将类型的成员与变量混淆.类/结构定义仅描述构成类型的内容,而不实际声明任何变量的存在,要在内存上构造的任何内容,任何可寻址的内容.

在传统意义上,现代课堂设计实践建议你假装它们是"黑盒子":东西进入,它们可以执行某些任务,也许输出一些其他信息.我们一直使用类方法,在.h/.hpp/.hxx文件中简要描述它们的签名,并将实现细节隐藏在.cpp/.cc/.cxx文件中.

虽然可以将相同的哲学应用于成员,但C++的当前状态,如何单独编译翻译单元使得这种方式更难实现.肯定没有任何"开箱即用"可以帮助你.基本的,基本的问题是,对于几乎任何使用你的类的东西,它需要知道以字节为单位的大小,这是由成员字段和声明顺序约束的.即使它们是私有的,并且类型范围之外的任何东西都不能操纵它们,它们仍然需要简要地知道它们是什么.

如果你真的想隐藏这些信息给外人,某些习惯用法如PImpl和内联的PImpl可以提供帮助.但我建议你不要这样做,除非你真的:

  1. 使用半稳定ABI编写库,即使您进行了大量更改.
  2. 需要隐藏不可移植的平台特定代码.
  3. 由于包含丰富的内容,需要减少预处理器时间.
  4. 需要减少直接受此信息泄露影响的编译时间.

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

如果您需要保留内存/构造某些内容并将其绑定到变量的名称,请始终尝试在源文件中进行此操作.


eml*_*lai 5

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

仅应声明非类成员且需要在头文件中声明的变量extern