如何从存储在字符串中的类型创建实例

时间:2013-10-23 14:56:16

标签: c++ oop polymorphism

我尝试从文本文件中读取一个类型并创建它的实例。例如

class MyType {
    public:
          MyType() {}
          ~MyType() {}     
};

char* type = "MyType";
type object = type(); 

我知道这不正确,但我认为它解释了我想做的很好。我问是否有办法做到这一点以及如何做?我知道有一种方法可以通过typeid(Type).name();将类型转换为字符串,但有没有办法扭转这种情况?意思是将字符串转换为类型。

感谢阅读:)。

编辑: 如果你仍然没有得到它。我想要的可以在c#这样做

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + className));

2 个答案:

答案 0 :(得分:3)

您必须使用design pattern factory

对于下面那些想要源代码的人,有一个快速而肮脏的工厂。 它使用c ++ 11,它不是const-correct并且对构造函数的参数有基本支持,只要它们通过创建函数都是相同的

#include <iostream>
#include <functional>
#include <memory>
#include <map>

template<class key,class Base,class ...Args> class Factory
{
  using creator = std::function<std::unique_ptr<Base>(Args...)>;
  std::map<key,creator> m;  
public:
  void registerF(key s,creator c)
    {
      m[s]=c;
    }

  std::unique_ptr<Base> operator()(key s,Args... a) 
    {
      return m[s](a...);
    }
};

struct A{virtual void foo()=0;};
struct B1 : A{virtual void foo(){std::cout<<"B1"<<std::endl;}};
struct B2 : A{virtual void foo(){std::cout<<"B1"<<std::endl;}};

template <class T> std::unique_ptr<T> creater()
{
  return std::unique_ptr<T>(new T());
}

int main() {
  Factory<std::string,A> f;
  f.registerF("B1",&creater<B1>);
  f.registerF("B2",&creater<B2>);
  auto p=f("B1");
  p->foo();

  return 0;
}

编辑:如果您尝试使用未注册的字符串实例化类,您将获得异常bad_function_call,因为map的operator []将为空的std :: function并调用它。

答案 1 :(得分:0)

以工厂为例:

class MyBase {};
class MyTypeA : public MyBase {};
class MyTypeB : public MyBase {};

std::shared_ptr< MyBase > make_instance( std::string type )
{
    if( type == "MyTypeA" )
        return std::make_shared< MyTypeA >();
    else
        return std::make_shared< MyTypeB >();
}

(你需要一些像<memory>我想的包含)