C++ - 使用 std::string 的内容调用同名的类实例
C++ - Using content of an std::string to call a class instance of the same name
>我正在尝试使用存储在 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系统上,您可以考虑使用dlopen
和dlsym
。仔细阅读 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 ++工厂模式"的更多例子。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 对象实例化调用构造函数的次数太多
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- C++中的单例实现在调用 getInstance 函数时不会产生相同的类实例
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- 从基类实例调用派生类方法而不进行强制转换
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- 在字符串函数中抛出'char const*'实例后调用的终止
- 如何使用 c++ 从另一个 cpp 文件中的 main.cpp 调用实例化类
- 统一功能使用模板专业化和接口来调用实例和原始类型
- 调用实例化函数时发生链接器错误
- 正在销毁调用实例
- 为什么我可以静态地调用实例函数