为什么我的全局变量必须声明为指针?

Cha*_*s W 0 c++ pointers global-variables new-operator

在编译我的C++程序时,我没有收到任何错误,但是在unordered_map中,哈希函数失败,尝试修改为0.(stl的hashtable_policy.h的第345行)

我找到了修复,但不知道为什么我开始时遇到问题.我的结构看起来像这样,(对不起特定的代码.)

struct Player {
private:
    Entity& entity = entityManager->create();
public:
    Player() {
        entity.addComponent(new PositionComponent(0, 0)); // Add component uses the unordered map.
    }
};
Player playerOne; // Error perpetuates through constructor.
Run Code Online (Sandbox Code Playgroud)

但是,如果我将playerOne声明为指针,就像这样:

Player* playerOne;
Run Code Online (Sandbox Code Playgroud)

然后打电话:

playerOne = new Player();
Run Code Online (Sandbox Code Playgroud)

我没有任何问题.

我一直在寻找 - 没有成功.我能做错什么?

Ste*_*ove 7

当您使用Player作为全局时,您不知道entityManager(可能是另一个全局)是否已经初始化 - 未定义全局变量的初始化顺序.

当你使用指针并用它new(在main(中​​,我推测)初始化它时,所有的全局变量都是在那时创建的,所以代码可以工作.

这突出了全局变量不好主意的原因之一.

  • 向Player添加构造函数参数以获取实体.在main()中,创建Entity对象,然后创建Player对象,传入刚刚创建的Entity.真正的问题是使用全局变量 - 而不是访问全局播放器的所有其他代码,将创建的Player实例传递给它们. (2认同)