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

objective c - In C++ how to convert a string to class object?

本文关键字:转换 对象 字符串 c++      更新时间:2023-10-16

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

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

是否有通用的方法来避免字符串比较?就像在objective C(动态语言)中一样,我们可以使用string…

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

如果您要返回的所有对象都是从一个公共基类派生的,那么您可以使用std::map<std::string,BaseClass *>。比较最终在某个地方,但它使事情更有条理。

不,你不能用标准的c++做到这一点。c++没有反射的概念。对不起:)

我认为您可能会使用利用抽象工厂模式的实现。这是一篇关于以Boost为中心的实现的非常好的文章。

No。在某种程度上,必须在代码中进行字符串比较。c++没有这种动态编程机制

No。但是为了优雅地绕过这个限制,我将枚举所有可能的类,并创建一个对应类名的数组:

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时,将字符串名称解码为enum并传递给工厂方法:

switch (classType)
{
  case CT_WATER_SCENE:
  {
    result = new WaterScene();
    break;
  }
  ...
}

我已经使用泛型类工厂来解决这个问题…首先,我注册类并将其存储在main()之前的映射中。