C++ - 使用 std::string 的内容调用同名的类实例

C++ - Using content of an std::string to call a class instance of the same name

本文关键字:调用 实例 std string C++ 使用      更新时间:2023-10-16

>我正在尝试使用存储在 std::string 中的值来调用同名的类实例,例如:

class myClass{int x;}
myClass hello;
std::string myString = "hello";

然后通过这样做:

myClass* pleaseWork = myString*;

我希望我能做到这一点:

std::cout << pleaseWork&.x;

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

changeToClass(<string>, <classToBeTurnedInto>)

谢谢!

编辑

抱歉,如果我没有说得太清楚,但我试图做的是调用名称存储在字符串中的类 - 所以如果 myString 包含"hello",我正在尝试使用实际字符串调用一个名为"hello"的类。它的实际用途包括将 class1 的类传递给 class2 的类,但只能通过从文件中读取它们(只能读取为 char[] 或 std::string)来知道要传递哪些类。

有点像这样,我不知道该怎么做C++。

完全可以将字符串映射到类:

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

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

在许多情况下,您可以使对象的所有使用都消失通过地图。 在这种情况下,您可以使用

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

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

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

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

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

阅读 c++ dlopen 迷你指南。

随着 C++11 阅读也关于type_info、bad_cast、dynamic_cast、RTTI ...

反射和类型内省很有用,但它们在C++中没有得到很好的支持(在 Java 中更可能)。还可以查看 poco 库和 Qt 元对象协议的内部。

您可以使用对象工厂模式解决方案。

在C++中没有真正的实现方法,但本质上您将创建一个静态 ObjectFactory 方法,该方法将类的名称作为参数。此方法将查找匹配的类定义,实例化类对象,并返回指向它的指针。

简单的例子:

class ObjectFactory 
{
public:
    static MyBaseClass *ObjectFactory::createObject(std::string className);
};
MyBaseClass *object = ObjectFactory::createObject("SomeClassName");

如果没有公共基类,只需返回 void * 并将其强制转换为实际的类指针即可。 还有更聪明的方法,使用智能指针和模板等C++功能。 实现的详细信息将取决于您的特定要求。

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

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

相关文章: