到目前为止,我一直在使用以下方式的课程:
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吗?
答案 0 :(得分:7)
不要将类型的成员与变量混淆。类/结构定义仅描述构成类型的内容,而不实际声明任何变量的存在,要在内存上构造的任何内容,任何可寻址的。
在传统意义上,现代课堂设计实践建议你假装它们是“黑匣子”:东西进入,它们可以执行某些任务,也许输出一些其他信息。我们一直使用类方法执行此操作,在.h / .hpp / .hxx文件中简要描述其签名,并将实现详细信息隐藏在.cpp / .cc / .cxx文件中。 / p>
虽然可以将相同的哲学应用于成员,但C ++的当前状态,单独编译翻译单元的方式使得这种方式难以实现。肯定没有任何“开箱即用”可以帮助你。基本的,基本的问题是,对于几乎任何使用你的类的东西,它需要知道以字节为单位的大小,这是由成员字段和声明顺序约束的。即使它们是私有的,并且类型范围之外的任何东西都不能操纵它们,它们仍然需要简要地知道它们是什么。
如果你真的想把这些信息隐藏到外人身上,某些习惯用法如PImpl和内联的PImpl可以提供帮助。但我建议你不要这样做,除非你真的:
指南实际上讨论的是永远不要在标题中声明全局变量。任何利用标题的翻译单元,即使是间接的,最终也会根据标题指令声明自己的全局变量。单独检查时,所有内容都会编译得很好,但是链接器会抱怨你对同一个东西有多个定义(这在C ++中是一个很大的禁忌)
如果您需要保留内存/构造某些内容并将其绑定到变量的名称,请始终尝试在源文件中进行此操作。
答案 1 :(得分:3)
类成员变量必须在类定义中声明,该类定义通常位于头文件中。这应该没有任何extern
关键字,完全正常,就像你到目前为止一样。
只有不是类成员且需要在头文件中声明的变量才应声明为extern
。
答案 2 :(得分:1)
作为一般规则:
要与同一类中的许多函数一起使用的变量都在类声明中。
各个函数的临时变量都在函数本身中。
似乎InputManager inputManager;
属于类标题。
int a, b, c;
从这里开始很难知道。它们用于什么?他们看起来就像临时变量一样,在他们使用的函数中会更好,但如果没有适当的上下文,我无法肯定地说。
extern
在这里没有用。