到目前为止,我一直按以下方式使用类:
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)变量,这些变量只会在类本身的实例中使用。我在头文件中的变量声明是否正常?还是我应该把它们放在别处?如果我应该将它们放在 cpp 文件中,它们是否直接放在 #include 下?
最佳答案
不要将类型的成员与变量混淆。类/结构定义只是描述什么构成了类型,而没有实际声明任何变量的存在,任何要在内存上构造的东西,任何可寻址。
在传统意义上,现代类设计实践建议您假装它们是“黑盒子”:东西进去,它们可以执行某些任务,也许会输出一些其他信息。我们一直使用类方法来执行此操作,在 .h/.hpp/.hxx 文件中简要描述它们的签名,并将实现细节隐藏在 .cpp/.cc/.cxx 文件中。
虽然相同的理念可以应用于成员,但 C++ 的当前状态、翻译单元如何单独编译使得这种方式更难实现。这里肯定没有什么“开箱即用”的东西可以帮助你。基本的根本问题是,对于几乎所有要使用您的类的东西,它都需要知道以字节为单位的大小,这是受成员字段和声明顺序限制的。即使它们是私有(private)的并且类型范围之外的任何东西都不能操纵它们,它们仍然需要简要地知道它们是什么。
如果您真的想向外人隐藏此信息,某些习惯用法(例如 PImpl 和内联 PImpl)可以提供帮助。但我建议您不要这样做,除非您确实:
- 编写具有半稳定 ABI 的库,即使您进行了大量更改。
- 需要隐藏不可移植的、特定于平台的代码。
- 由于大量包含,需要减少预处理器时间。
- 需要减少受此信息公开直接影响的编译时间。
指南实际上是在谈论永远不要在 header 中声明全局变量。任何利用您的 header 的翻译单元,即使是间接的,最终也会根据 header 说明声明其自己的全局变量。单独检查时一切都会编译得很好,但链接器会提示你对同一事物有多个定义(这在 C++ 中是一个很大的禁忌)
如果您需要保留内存/构造某些东西并将其绑定(bind)到变量的名称,请始终尝试在源文件中实现这一点。
关于 header 或 .cpp 中类变量的 C++ 声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28517555/