到目前为止,我一直通过以下方式使用类:
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是否有意义。我只是声明私有(private)变量,这些私有(private)变量将仅在类本身的实例中使用。头文件中的变量声明可以吗?还是应该把它们放在其他地方?如果我应该将它们放在cpp文件中,它们是否直接位于#include下?
最佳答案
不要将类型的成员与变量混淆。类/结构定义仅描述了构成类型的内容,而没有实际声明任何变量的存在,要在内存中构造的任何内容,任何可寻址的内容。
在传统意义上,现代的类设计实践建议您假装它们是“黑匣子”:东西进来了,它们可以执行某些任务,或者输出其他信息。我们始终使用类方法来执行此操作,在.h/.hpp/.hxx文件中简要描述其签名,并将实现细节隐藏在.cpp/.cc/.cxx文件中。
尽管可以将相同的原理应用于成员,但是C++的当前状态以及如何分别编译翻译单元使这种方法难以实现。当然,这里没有任何“开箱即用”的东西可以帮助您。基本的基本问题是,对于几乎所有要使用您的类的类,都需要知道字节大小,而这受成员字段和声明顺序的约束。即使它们是私有(private)的,并且类型范围之外的任何东西都不能操纵它们,但它们仍然需要简短地知道它们是什么。
如果您实际上想向外部人员隐藏此信息,则某些惯用语(例如PImpl和内联PImpl)可能会有所帮助。但我建议您不要这样,除非您实际上是:
该准则实际上在谈论的是永远不要在 header 中声明全局变量。任何利用您的 header 的转换单元,即使是间接使用的 header ,最终都将按照 header 指令声明其自己的全局变量。当单独检查时,所有内容都可以正常编译,但是链接器会提示您对同一事物有多个定义(这在C++中是一个很大的禁忌)
如果您需要保留内存/构造某些东西并将其绑定(bind)到变量的名称,请始终尝试在源文件中进行更改。
关于c++ - 用C++声明 header 或.cpp中的类变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28517555/