我有一个需要“全局”的对象,我需要能够从其他类.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实例,但我需要访问已初始化的原始实例。
这整个结构可能是不正确的方法。任何有关解决此问题或更有效方法的提示或建议都非常感谢。谢谢你的时间。
答案 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
}
ActorHandler
和WorldHandler
的构造函数(const
)对CoreEnvironment
的引用。