在C ++中如何将字符串转换为类对象?

时间:2011-07-14 12:24:58

标签: c++ objective-c

例如我有一个名为“WaterScene”的类,在.xml中我保存为字符串“WaterScene”,当我读取.xml时,我必须将该字符串转换为类。一种方法是字符串比较

if( string == "WaterScene")
return new WaterScene;

有没有通用的方法来避免字符串比较?就像在目标C(动态语言)中一样,我们可以使用字符串...

来获取类
Class classObject =[[NSBundle mainBundle] classNamed:string];

6 个答案:

答案 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()之前的地图中。