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

标签 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 是否有意义;我只是声明私有(private)变量,这些变量只会在类本身的实例中使用。我在头文件中的变量声明是否正常?还是我应该把它们放在别处?如果我应该将它们放在 cpp 文件中,它们是否直接放在 #include 下?

最佳答案

不要将类型的成员与变量混淆。类/结构定义只是描述什么构成了类型,而没有实际声明任何变量的存在,任何要在内存上构造的东西,任何可寻址

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

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

如果您真的想向外人隐藏此信息,某些习惯用法(例如 PImpl 和内联 PImpl)可以提供帮助。但我建议您不要这样做,除非您确实:

  1. 编写具有半稳定 ABI 的库,即使您进行了大量更改。
  2. 需要隐藏不可移植的、特定于平台的代码。
  3. 由于大量包含,需要减少预处理器时间。
  4. 需要减少受此信息公开直接影响的编译时间。

指南实际上是在谈论永远不要在 header 中声明全局变量。任何利用您的 header 的翻译单元,即使是间接的,最终也会根据 header 说明声明其自己的全局变量。单独检查时一切都会编译得很好,但链接器会提示你对同一事物有多个定义(这在 C++ 中是一个很大的禁忌)

如果您需要保留内存/构造某些东西并将其绑定(bind)到变量的名称,请始终尝试在源文件中实现这一点。

关于 header 或 .cpp 中类变量的 C++ 声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28517555/

相关文章:

c++ - 直接访问唯一的类数据成员

C++ 'class' 类型重定义错误

c - 将函数变量声明为局部而不是全局会不会影响效率?

c++ - 在 curand_kernel.h 之前包含 thrust/sort.h 会产生编译错误

c - 奇怪的变量类型声明

Perl "my $bar if 0;"与 "my $bar = undef if 0;"

c++ - 如何阻止绘画事件传播?

c++ - C++中的继承, "...is an ambiguous base of ..."错误

c++ - 初始化模板数组

c++ - 如何根据编译器指令 -D 自动选择 include.h 文件?