关于C ++:C ++ – 使用std :: string的内容来调用同名的类实例

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;

我只是想知道这是否可能,或者是否有像这样的关键词

changeToClass(, )

谢谢您!

编辑

抱歉,如果我没有说得太清楚,但是我要做的是调用一个名存储在字符串中的类-因此,如果我的字符串包含"hello",我将使用实际字符串调用一个名为"hello"的类。这种方法的实际应用包括将Class1类传递给Class2类,但只知道通过从文件中读取哪些类来传递(只能读取为char[]或std::string)。

有点像这样,我不知道如何在C++中做。


将字符串映射到类是完全可能的:

1
std::map<std::string, MyClass*> map;

然后在地图上查找字符串。问题是指向对象的指针进入映射。您必须初始化手工绘制地图;更重要的是,您必须确保对象的生存期,确保将其从地图中删除在它被摧毁之前。

在许多情况下,您可以使用该对象通过地图。在这种情况下,您可以使用

1
std::map<std::string, MyClass> map;

(不带指针):对象直接构造到并通过调用地图上的erase进行破坏。(这个在某种程度上,是另一种动态分配。除了那个使用字符串而不是指针来寻址对象。)


在运行时,用它的名称获取变量或函数通常在标准C++中是不可能的。

但是,您可能对动态链接和动态加载设施感兴趣。

在Linux和其他一些POSIX系统上,您可以考虑使用dlopendlsym。仔细阅读DLopen(3)手册页。dlsymed名称通常应声明为extern"C"以避免名称混淆。

读取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");

如果没有公共的基类,可以简单地返回void *,并将其转换为实际的类指针。还有更聪明的方法,使用C++特性,如智能指针和模板。实现的细节将取决于您的具体需求。

这个主题在这里已经被多次讨论过了。例如,请参阅此处和此处相关问题中的讨论。

你也可以谷歌"C++工厂模式"为更多的例子。