到目前为止,我一直通过以下方式使用类:

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)可能会有所帮助。但我建议您不要这样,除非您实际上是:

  • 编写具有半稳定ABI的库,即使您进行了大量更改。
  • 需要隐藏不可移植的,平台特定的代码。
  • 由于包含的内容丰富,因此需要减少预处理器时间。
  • 需要减少这种信息暴露直接影响的编译时间。

  • 该准则实际上在谈论的是永远不要在 header 中声明全局变量。任何利用您的 header 的转换单元,即使是间接使用的 header ,最终都将按照 header 指令声明其自己的全局变量。当单独检查时,所有内容都可以正常编译,但是链接器会提示您对同一事物有多个定义(这在C++中是一个很大的禁忌)

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

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

    10-09 08:45
    查看更多