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

时间:2013-03-07 13:35:53

标签: c++

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

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 ++在访问变量时受到限制的其他解释,就像上面的情况一样。

1 个答案:

答案 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