例如我有一个名为“WaterScene”的类,在.xml中我保存为字符串“WaterScene”,当我读取.xml时,我必须将该字符串转换为类。一种方法是字符串比较
if( string == "WaterScene")
return new WaterScene;
有没有通用的方法来避免字符串比较?就像在目标C(动态语言)中一样,我们可以使用字符串...
来获取类Class classObject =[[NSBundle mainBundle] classNamed:string];
答案 0 :(得分:7)
如果要返回的所有对象都是从公共基类派生的,则可以使用std::map<std::string,BaseClass *>
。比较最终存在于某处,但它使事情更有条理。
答案 1 :(得分:4)
不,你不能用标准的C ++做到这一点。 C ++没有reflection的概念。对不起:)
答案 2 :(得分:2)
我认为你可能会使用一个利用Abstract Factory Pattern的实现。这是关于Boost centric implementation的一篇非常好的文章。
答案 3 :(得分:0)
没有。在某种程度上,必须在代码中进行字符串比较。 C ++没有任何机制来进行这种动态编程。
答案 4 :(得分:0)
没有。但为了优雅地解决这个限制,我会枚举所有可能的类并创建一个相应类名的数组:
enum ECLASSTYPE
{
CT_WATER_SCENE,
CT_SOME_OTHER,
CT__MAX,
};
static const string g_classNames[CT__MAX] =
{
"WaterScene", // CT_WATER_SCENE
"SomeOther", // CT_SOME_OTHER
};
解析xml时,将字符串名称解码为枚举并将其传递给工厂方法:
switch (classType)
{
case CT_WATER_SCENE:
{
result = new WaterScene();
break;
}
...
}
答案 5 :(得分:0)
我使用Generic Class factory来解决问题...首先我正在注册类并将其存储在main()之前的地图中。