我不是在谈论指向实例的指针,我想要一个指向类本身的指针。
9 回答
在 C++ 中,类不是“第一类对象”。您可以获得的最接近的是指向其type_info
实例的指针。
不,指针是运行时计算机内存中某物的地址。一个类只是给编译器的一组指令。
正如其他人已经说过的那样,不可能有一个指向类的指针。
但是,如果重点是从运行时选择的某个类创建一个新实例,您可能需要查看工厂方法(或抽象工厂)设计模式。
是和否。这取决于您要达到的目标的背景。如果您只是想要一个指向类型的指针,那么没有办法。就指针而言,类型并不存在于内存中。
我说是的原因是有些人会认为虚拟表是指向类型的指针。由于虚拟表确实存在于内存中,并且可以通过一些技巧来调用虚拟方法,因此可以获得此指针是可能的。
与真正的基于对象的语言不同,类在 C++ 中不是对象,更可惜的是。最接近“类指针”的是 RTTI:
const std::type_info &info = typeid(对象表达式);
type_info 有 name() 成员函数,它们可以相互比较。
“类”不存在。您唯一可以指出的是数据。
“类”的其余部分实际上是一个调度表。对于类中的每个方法,调度表都有一个指针。这样,无论当前转换为哪种类型,该类都指向您的类的正确方法。这将是无用的访问。
类中的方法(调度表指向的东西)实际上只是在类数据指针中传递的“函数”。方法的定义几乎就是一个将类数据作为参数的函数。在大多数 C 风格的语言中,该数据指针是隐藏的,但称为“this”。
您的类的方法可能遍布整个代码库。由于父类,您甚至不可能发现这些方法彼此相邻。
根据您对指针的看法,您可以拥有一个指向类的“指针”,如果指针是指某个整数值。Boost 允许您注册类型并为您注册的每种类型分配一个唯一的整数。如果您注册的类型都是类,那么您可以在运行时查找创建所需类型的对象所需的代码,只要您具有所需类型的值。但一般来说,类不是语言中的第一类对象,你能希望的最好的就是模拟你想要的行为。
诚然,C++ 中不支持反射/内省,但是有许多库将添加许多例如 java 的 Class 功能,并允许程序员获取表示类的对象、创建实例等. 谷歌 C++ 反射。