0

我定义了以下结构,供多个类在应用程序中使用。

ZHTypes.h

#ifndef ZHTypes_h
#define ZHTypes_h

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

#endif

我定义了以下变量

default_BeingHitParams_ptr

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

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

static BeingHitParams *default_BeingHitParams_ptr = new BeingHitParams();

所以我的问题是为什么我们不能从一个类中访问全局但非静态的变量?我还想知道为什么 C++ 在访问变量时受到限制的额外解释,如上述情况。

4

1 回答 1

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();

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

于 2013-03-07T13:38:44.890 回答