如何将字符串转换为类名

时间:2011-03-27 06:44:43

标签: c++

  

可能重复:
  C++: instantiate class from name?

例如,如果我有

string s = "myObject";

那么如何使用String来制作这个呢?

return new myObject();

我试过这个,但它很傻,这是错误的

return new s();

谢谢

5 个答案:

答案 0 :(得分:8)

您可以创建一个简单的工厂并注册您希望能够构建的类。这是一种非常轻量级的反思。

#include <map>
#include <string>

template <class T> void* constructor() { return (void*)new T(); }

struct factory
{
   typedef void*(*constructor_t)();
   typedef std::map<std::string, constructor_t> map_type;
   map_type m_classes;

   template <class T>
   void register_class(std::string const& n)
   { m_classes.insert(std::make_pair(n, &constructor<T>)); }

   void* construct(std::string const& n)
   {
      map_type::iterator i = m_classes.find(n);
      if (i == m_classes.end()) return 0; // or throw or whatever you want
      return i->second();
   }
};

factory g_factory;

#define REGISTER_CLASS(n) g_factory.register_class<n>(#n)

int main()
{
   using namespace std;

   REGISTER_CLASS(string);

   std::string* s = (std::string*)g_factory.construct("string");

   printf("s = '%s'\n", s->c_str());
   *s = "foobar";
   printf("s = '%s'\n", s->c_str());

   return 0;
}

答案 1 :(得分:1)

您想要的是virtual constructor (pattern)。语言中此功能的可用性不一定与VM解释或管理的语言相关 - 它取决于程序(或库)中存在的有关类型的信息在运行时是如何(如果有的话) 。在“裸”C ++中并非如此 - 但它可以实现,例如Arvid所示。问题是这个功能没有标准化的实现,所以每个人都在不断地重新发明这个。在某种程度上COM或它的平台独立对应XPCOM在组件级别“标准化”。

答案 2 :(得分:0)

你不能通过设计在c ++中做到这一点。在c ++中,类型和对象之间有明显的区别,它们是语言的两个非常不同的实体。因此,您只能实例化一个类型并获取一个对象,并决定在编译时这样做(c ++不提供任何类型的反射系统,不像c#或java)。

但是,您可以将工厂/注册表用于要以此方式实例化的对象。

答案 3 :(得分:0)

你需要Reflection才能做到这一点。但是C ++ AFAIK不支持反射。

有趣的是QT C++支持某种反思。查看C# section它在那里的完成情况,Javascript有一个功能来执行此操作。它被称为eval()

答案 4 :(得分:-2)

使用C ++是不可能的,因为代码是自己运行的。只有解释型语言(如PHP)或通过解释程序运行的程序才允许使用此类功能。