做过游戏的都知道在游戏服务器中配置文件很多,基本上会达到两三百张配置表,而加载配置的方式有很多,下面就为大家介绍几种配置加载的方式。
首先简介一种常用的也是最简单的方式,那就是包含所有的配置文件一个个的调用,代码大致如下:
//a.h 配置文件a
bool loada();//加载配置文件a
//b.h 配置文件b
bool loadb();//加载配置文件b
……
//cfgmgr.h 统一调用配置文件加载函数
include“a.h”
include“b.h”
……
void loadall(){
loada();
loadb ()
}
这种方式简单易学,一般做过项目的人都能够想到,但是在每次增加新的配置的时候都需要在cfgmgr文件中包含头文件并且调用加载函数。
下面我们对上面的代码进行一下改进,我们希望增加配置的时候不需要在cfgmgr中包含头文件和调用对应的函数,这样可以减少头文件包含加快编译速度,避免修改任何配置头文件都会重新编译cfgmgr。代码大致如下:
//cfgmgr.h
class CfgBase;
class CfgMgr:public CSingleton<CfgMgr>{//CSingleton 为单例
void addcfg(CfgBase* cfg){m_allCfg.emplace_back(cfg)}
void load(){
for(auto& iter : m_allCfg)
iter->load();}
private:
std::vector<CfgBase* >m_allCfg;
};
class CfgBase{
CfgBase(){CfgMgr::instance().addcfg(this);}//在构造的时候把自己注册到CfgMgr中
virtual ~CfgBase();
virtual void load()=0;
};
//a.h//配置a
class A:public CfgBase,public CSingleton<A>{
void load();//加载a
};
//a.cpp//配置a
static bool __TYPE__ =&A::instance() != NULL;//注意这里是在cpp文件中定义一个静态变量,全局静态变量会在调用main函数之前初始化,在初始化的时候就会调用单例生成对象,生成对象的时候在调用构造函数这样就可以实现自动注册到配置管理器中了。我们不用在管理器中一个个头文件包含和调用。
那可能的人不想使用继承,就希望自己定义的任意类型都能够加到配置管理器中,或者是包括配置或者数据加载都放到一个管理器中,下面介绍一种更为特殊的加载方式,代码如下:
//cfgmgr.h
#ifndef