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

时间:2015-02-14 16:18:58

标签: 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
};

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

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

}

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

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

  1. 使用半稳定ABI编写库,即使您进行了大量更改。
  2. 需要隐藏不可移植的,特定于平台的代码。
  3. 由于包含大量内容,需要缩短预处理时间。
  4. 需要减少直接受此信息泄露影响的编译时间。
  5. 指南实际上讨论的是永远不要在标题中声明全局变量。任何利用标题的翻译单元,即使是间接的,最终也会根据标题指令声明自己的全局变量。单独检查时,所有内容都会编译得很好,但是链接器会抱怨你对同一个东西有多个定义(这在C ++中是一个很大的禁忌)

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

答案 1 :(得分:3)

类成员变量必须在类定义中声明,该类定义通常位于头文件中。这应该没有任何extern关键字,完全正常,就像你到目前为止一样。

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

答案 2 :(得分:1)

作为一般规则:

要与同一类中的许多函数一起使用的变量都在类声明中。

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

似乎InputManager inputManager;属于类标题。

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

extern在这里没有用。