背景:
在我的游戏引擎中,我有一个通用的“脚本解析器”,用于通过解析脚本文件来创建游戏实体。所以在代码中你会有类似的东西MyEntity* entity = MyScriptParer::Parse("filename.scr");
任何可编写脚本的类都继承自通用基类。在游戏引擎内部,有一些特定的类使用它——粒子、字体等,这一切在解析器中都能很好地工作——见下面的摘录
std::string line;
std::getline(ifs, line);
if (line == "[FONT]") {
CFont* f = new CFont();
f->readObject(ifs);
}
else if (line == "[PARTICLE]") {
CParticle* p = new CParticle();
p->readObject(ifs);
}
...
我的问题在于如何处理用户定义的类,即使用游戏引擎的游戏中的类。基类有一个抽象方法readObject
,所以任何继承的东西都必须实现这个方法。
问题是解析器如何知道新类?例如,假设我有一个CVehicle
类,解析器现在需要知道以识别“[VEHICLE]”并且还能够创建一个new CVehicle
有没有办法在数组/映射中存储类类型或其他东西,所以也许我可以有一个函数来注册一个带有字符串的类类型列表,以提供创建新实例的查找?
有点长镜头,可能不可能,所以如果有人对如何处理解析有其他建议,他们将受到欢迎