我正在尝试使用存储在std :: string中的值来调用同名的类实例,例如:
class myClass{int x;}
myClass hello;
std::string myString = "hello";
然后通过这样做:
myClass* pleaseWork = myString*;
我希望我能做到这一点:
std::cout << pleaseWork&.x;
我只是想知道这是否真的可行,或者是否有像
这样的关键字 changeToClass(<string>, <classToBeTurnedInto>)
谢谢!
很抱歉,如果我没有说清楚,但我要做的是调用一个名字存储在字符串中的类 - 所以如果myString包含“hello”我试图调用一个叫做的类通过使用实际的字符串“你好”。实际使用包括将class1的类传递给class2的类,但只知道从文件中读取哪些类(只能读取为char []或std :: string)。
有点像this,我不知道如何用C ++做。
答案 0 :(得分:4)
在运行期间通过名称获取变量或函数通常在标准C ++中是不可能的。
但是,您可能对dynamic linking和dynamic loading设施感兴趣。
在Linux和其他一些Posix系统上,您可以考虑使用dlopen
和dlsym
。仔细阅读dlopen(3)手册页。通常应将dlsym
- ed名称声明为extern "C"
,以避免name mangling ....
阅读c++ dlopen迷你指南。
C++11还可以阅读type_info,bad_cast,dynamic_cast,RTTI ...
reflection和type introspection很有用,但它们在C ++中得不到很好的支持(在Java中更有可能)。另请参阅poco库内部和Qt meta object protocol ....
答案 1 :(得分:4)
将字符串映射到类是完全可能的:
std::map<std::string, MyClass*> map;
然后在地图中查找字符串。问题是如何 指向对象的指针进入地图。你必须初始化 手绘地图;更重要的是,你必须确保 对象的生命周期,一定要从地图中删除它 在它被破坏之前。
在许多情况下,您可以完全使用该对象 通过地图。在这种情况下,您可以使用
std::map<std::string, MyClass> map;
(没有指针):对象直接构造成
地图,并通过在地图上调用erase
进行破坏。 (这个
在某种程度上,是另一种动态分配。除了那个
而不是指针,你使用字符串来处理对象。)
答案 2 :(得分:3)
您可以使用对象工厂模式解决方案。
在C ++中实际上没有一种标准的实现方法,但实质上你会创建一个静态的ObjectFactory方法,它将一个类的名称作为参数。此方法将查找匹配的类定义,实例化一个类对象,并返回指向它的指针。
简单示例:
class ObjectFactory
{
public:
static MyBaseClass *ObjectFactory::createObject(std::string className);
};
MyBaseClass *object = ObjectFactory::createObject("SomeClassName");
如果没有公共基类,只需返回void *
并将其强制转换为实际的类指针即可。还有更聪明的方法,使用C ++功能,如smart pointers和模板。您的实施细节将取决于您的具体要求。
此主题已在SO上多次讨论过。例如,请参阅相关问题here和here中的讨论。
您还可以使用Google“c ++ factory pattern”获取更多示例。