为什么我们不能从类中访问全局非静态变量?

hax*_*por 0 c++

我定义了以下几个类在应用程序中使用的结构.

ZHTypes.h

#ifndef ZHTypes_h
#define ZHTypes_h

struct BeingHitParams
{
    bool isApplyKnockBack=true;
};
BeingHitParams *default_BeingHitParams_ptr = new BeingHitParams();

#endif
Run Code Online (Sandbox Code Playgroud)

我定义了一个跟随变量

default_BeingHitParams_ptr
Run Code Online (Sandbox Code Playgroud)

对于这种情况,我将在几个地方使用它作为函数的默认参数,因为我不需要一直创建一个新的结构.

无论如何,每当我在类中的代码中引用它时,上面定义的变量就会产生链接错误.但如果我在前面添加静态,那么它可以正常工作.

static BeingHitParams *default_BeingHitParams_ptr = new BeingHitParams();
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么我们不能从类中访问全局但非静态的变量?我还想知道为什么C++在访问变量时受到限制的其他解释,就像上面的情况一样.

Jos*_*eld 6

如果你放在static它前面,那么你给它内部链接,每个包含该标题的翻译单元都有自己的副本default_BeingHitParams_ptr.你真正想要做的是extern在头文件中声明它(它不仅使它具有外部链接,而且使它成为声明而不是定义),然后在单个翻译单元中定义它:

// ZHTypes.h
// Now this is just a declaration:
extern BeingHitParams *default_BeingHitParams_ptr;

// ZHTypes.cpp
// Defined in a single translation unit:
BeingHitParams* default_BeingHitParams_ptr = new BeingHitParams();
Run Code Online (Sandbox Code Playgroud)

然而,引入全球状态通常是一件坏事.