我定义了几个类在应用程序中使用的以下结构。
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 ++在访问变量时受到限制的其他解释,就像上面的情况一样。
答案 0 :(得分: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();
但是,引入全局状态是usually a bad thing。