创建一个全局的C++对象

3
我有一个需要“全局”使用的对象,我需要能够从其他类的.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实例,但我需要访问已初始化的原始实例。

整个结构可能不是正确的方法。非常感谢您的时间,如果有任何解决此问题或更有效的方法的提示或建议,请告诉我。谢谢。


“单例模式”是一个很好的标签,因为它是符合这种要求的一种设计模式。那么是什么“负面评论”阻止了您使用它呢?或者是您没有“完全理解”它? - Solkar
1个回答

7
不要在头文件中定义对象实例,只需提供声明,并在单个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


谢谢。我考虑过将它们传递给构造函数,但是有超过两个类,并且在这些类中创建了其他需要访问CoreEnv的对象,甚至有些对象创建了其他需要CoreEnv的对象,因此我不太愿意将其向下传递那么多次层级结构。 - KKlouzal
2
@KKlouzal,你应该能够在SO上找到关于为什么全局实例和单例模式不好的好答案,但有时它们比通过深层次的层次结构传递对象引用更方便。最终,这取决于平衡负面因素和方便性,并为您的用例做出正确的决策。 - Praetorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接