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

时间:2013-10-21 18:22:44

标签: c++ string class

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

3 个答案:

答案 0 :(得分:4)

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

但是,您可能对dynamic linkingdynamic loading设施感兴趣。

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

阅读c++ dlopen迷你指南。

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

reflectiontype 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上多次讨论过。例如,请参阅相关问题herehere中的讨论。

您还可以使用Google“c ++ factory pattern”获取更多示例。