2

我正在尝试使用存储在 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++ 中做。

4

3 回答 3

4

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

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

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

阅读c++ dlopen mini howto。

使用C++11还可以阅读type_infobad_castdynamic_castRTTI ...

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

于 2013-10-21T18:27:28.983 回答
4

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

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

然后在地图中查找字符串。问题是指向对象的指针如何进入地图。您必须手动初始化地图;更重要的是,您必须确保对象的生命周期,确保在销毁之前将其从地图中移除。

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

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

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

于 2013-10-21T18:32:48.690 回答
3

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

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

简单的例子:

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

MyBaseClass *object = ObjectFactory::createObject("SomeClassName");

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

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

您还可以在 Google 上搜索“c++ 工厂模式”以获取更多示例。

于 2013-10-21T18:41:54.580 回答