创建全局C++对象

KKl*_*zal 2 c++ singleton global-variables extern c++11

我有一个对象需要是"全局的",在某种意义上我需要能够从我的其他类.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;
Run Code Online (Sandbox Code Playgroud)

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

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

Pra*_*ian 6

不要在头文件中定义对象实例.在那里提供声明并在单个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;
Run Code Online (Sandbox Code Playgroud)

CoreEnvironment.cpp

#include "CoreEnvironment.h"

CoreEnvironment CoreEnv;
Run Code Online (Sandbox Code Playgroud)

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

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

    // do stuff with actor and world
}
Run Code Online (Sandbox Code Playgroud)

这里的构造ActorHandler,并WorldHandler采取(也许const)来引用CoreEnvironment.

  • @KKlouzal你应该能够在SO上找到关于全局实例和单例是坏的原因的好答案,但有时它们比通过深层次结构传递对象引用更方便.最后,它归结为平衡负面和方便,并为您的用例做出正确的决定. (2认同)