创建全局C ++对象

时间:2014-07-12 07:35:21

标签: c++ c++11 singleton global-variables extern

我有一个需要“全局”的对象,我需要能够从其他类.h和.cpp文件中访问它。我不知道如何处理这个问题,所以让我更详细地描述一下这个问题。

我有一个名为CoreEnvironment的类。这个类将我的引擎的核心保持在它的最低级别,例如:渲染,网络,物理和路径查找。这个类中只有一个实例可以同时存在,并且它存在于应用程序的整个生命周期中。我的第一个想法是创建它作为一个单身人士,但在做研究后,有很多关于使用单身人士的负面评论,我也不完全理解如何创建一个。在我的研究中,我看到了“Extern”关键字的使用,但是我不清楚它的用法。

这是班级的骨架:

class CoreEnvironment
{
    NetHandler* m_NET;
    NetPoint* Server;
    PhysicsHandler* m_Physics;
    irr::IrrlichtDevice* Device;
    irr::ITimer* Timer;

public:
    CoreEnvironment();
    ~CoreEnvironment();

    bool RunDevice();
    void Update();
} CoreEnv;

我的引擎中有一些更高级别的类,例如:ActorHandler和WorldHandler。在这两个类的.cpp文件中,我需要访问CoreEnv。如果我只是#include“CoreEnvironment.h”,每次包含该文件时都会创建另一个CoreEnv实例,但我需要访问已初始化的原始实例。

这整个结构可能是不正确的方法。任何有关解决此问题或更有效方法的提示或建议都非常感谢。谢谢你的时间。

1 个答案:

答案 0 :(得分:5)

不要在头文件中定义对象实例。在那里提供声明并在单个cpp文件中定义对象。例如,

CoreEnvironment.h

class CoreEnvironment
{
    NetHandler* m_NET;
    NetPoint* Server;
    PhysicsHandler* m_Physics;
    irr::IrrlichtDevice* Device;
    irr::ITimer* Timer;

public:
    CoreEnvironment();
    ~CoreEnvironment();

    bool RunDevice();
    void Update();
};

extern CoreEnvironment CoreEnv;

CoreEnvironment.cpp

#include "CoreEnvironment.h"

CoreEnvironment CoreEnv;

如果只有两个其他类需要访问CoreEnv对象,那么您可能需要重新考虑对全局实例的需求。相反,这样的事情就足够了。

int main()
{
    CoreEnvirnment CoreEnv;
    ActorHandler actor(CoreEnv); 
    WorldHandler world(CoreEnv);

    // do stuff with actor and world
}

ActorHandlerWorldHandler的构造函数(const)对CoreEnvironment的引用。