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实例,但我需要访问已初始化的原始实例.
整个结构可能是不正确的方法.任何有关解决此问题或更有效方法的提示或建议都非常感谢.感谢您的时间.
不要在头文件中定义对象实例.在那里提供声明并在单个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.