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