c++ - 创建全局 C++ 对象

标签 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 实例,但我需要访问已初始化的原始实例。

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

最佳答案

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

核心环境.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;

核心环境.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 的引用。

关于c++ - 创建全局 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24710768/

相关文章:

c++ - 使用外部文件和链接文件

c++ - 传递文本文件而不是用户输入作为命令行参数

c++ - 从 Pulse Audio 运行简单的 C 程序时出错

c++ - 如何在函数声明中为 std::unordered_map 的引用分配默认(空)值?

python - 运行包含单例的已编译应用程序时出现问题

java - 单例模式

c++ - 什么时候使用 'typeid' 是最好的解决方案?

c++ - 以下向 C++ vector 添加元素的方法有什么区别

c++ - std::unique_ptr 与自定义自由操作结合使用

c# - 单例 - 我可以创建多个实例