C++ - Using content of an std::string to call a class instance of the same name
我尝试使用存储在std::string中的值来调用同名的类实例,例如:
1 2 3 4 | class myClass{int x;} myClass hello; std::string myString ="hello"; |
然后这样做:
1 | myClass* pleaseWork = myString*; |
我希望我能做到:
1 | std::cout << pleaseWork&.x; |
我只是想知道这是否可能,或者是否有像这样的关键词
谢谢您!
编辑抱歉,如果我没有说得太清楚,但是我要做的是调用一个名存储在字符串中的类-因此,如果我的字符串包含"hello",我将使用实际字符串调用一个名为"hello"的类。这种方法的实际应用包括将Class1类传递给Class2类,但只知道通过从文件中读取哪些类来传递(只能读取为char[]或std::string)。
有点像这样,我不知道如何在C++中做。
将字符串映射到类是完全可能的:
1 | std::map<std::string, MyClass*> map; |
然后在地图上查找字符串。问题是指向对象的指针进入映射。您必须初始化手工绘制地图;更重要的是,您必须确保对象的生存期,确保将其从地图中删除在它被摧毁之前。
在许多情况下,您可以使用该对象通过地图。在这种情况下,您可以使用
1 | std::map<std::string, MyClass> map; |
(不带指针):对象直接构造到并通过调用地图上的
在运行时,用它的名称获取变量或函数通常在标准C++中是不可能的。
但是,您可能对动态链接和动态加载设施感兴趣。
在Linux和其他一些POSIX系统上,您可以考虑使用
读取C++ DLINK迷你HOWTO。
用C++ 11还读取了Type信息、BADYCAST、DyrimCype、RTTI…
反射和类型内省是有用的,但是它们在C++中不是很好的支持(在Java中更可能)。还可以查看poco库和qt元对象协议……
您可以使用对象工厂模式解决方案。
在C++中没有一种标准的实现方法,但本质上,您将创建一个静态ObjeC工厂方法,它将作为类的名称作为参数。此方法将查找匹配的类定义,实例化类对象,并返回指向它的指针。
简单例子:
1 2 3 4 5 6 7 | class ObjectFactory { public: static MyBaseClass *ObjectFactory::createObject(std::string className); }; MyBaseClass *object = ObjectFactory::createObject("SomeClassName"); |
如果没有公共的基类,可以简单地返回
这个主题在这里已经被多次讨论过了。例如,请参阅此处和此处相关问题中的讨论。
你也可以谷歌"C++工厂模式"为更多的例子。