8

我不是在谈论指向实例的指针,我想要一个指向类本身的指针。

4

9 回答 9

17

在 C++ 中,类不是“第一类对象”。您可以获得的最接近的是指向其type_info实例的指针。

于 2008-11-13T00:10:27.827 回答
5

不,指针是运行时计算机内存中某物的地址。一个类只是给编译器的一组指令。

于 2008-11-13T00:07:40.063 回答
4

正如其他人已经说过的那样,不可能有一个指向类的指针。

但是,如果重点是从运行时选择的某个类创建一个新实例,您可能需要查看工厂方法(或抽象工厂)设计模式。

于 2008-11-13T00:31:19.877 回答
1

是和否。这取决于您要达到的目标的背景。如果您只是想要一个指向类型的指针,那么没有办法。就指针而言,类型并不存在于内存中。

我说是的原因是有些人会认为虚拟表是指向类型的指针。由于虚拟表确实存在于内存中,并且可以通过一些技巧来调用虚拟方法,因此可以获得此指针是可能的。

于 2008-11-13T00:09:57.017 回答
1

与真正的基于对象的语言不同,类在 C++ 中不是对象,更可惜的是。最接近“类指针”的是 RTTI:

const std::type_info &info = typeid(对象表达式);

type_info 有 name() 成员函数,它们可以相互比较。

于 2008-11-13T00:14:32.577 回答
1

“类”不存在。您唯一可以指出的是数据。

“类”的其余部分实际上是一个调度表。对于类中的每个方法,调度表都有一个指针。这样,无论当前转换为哪种类型,该类都指向您的类的正确方法。这将是无用的访问。

类中的方法(调度表指向的东西)实际上只是在类数据指针中传递的“函数”。方法的定义几乎就是一个将类数据作为参数的函数。在大多数 C 风格的语言中,该数据指针是隐藏的,但称为“this”。

您的类的方法可能遍布整个代码库。由于父类,您甚至不可能发现这些方法彼此相邻。

于 2008-11-13T00:20:15.843 回答
1

您不能拥有指向类的(运行时)指针,但 C++ 确实具有类似的编译时概念:模板参数Boost有一个专门用于操作它们的库和一个用于获取类信息的特征库。

于 2008-11-13T00:32:07.800 回答
0

根据您对指针的看法,您可以拥有一个指向类的“指针”,如果指针是指某个整数值。Boost 允许您注册类型并为您注册的每种类型分配一个唯一的整数。如果您注册的类型都是类,那么您可以在运行时查找创建所需类型的对象所需的代码,只要您具有所需类型的值。但一般来说,类不是语言中的第一类对象,你能希望的最好的就是模拟你想要的行为。

于 2008-11-13T03:31:10.747 回答
0

诚然,C++ 中不支持反射/内省,但是有许多库将添加许多例如 java 的 Class 功能,并允许程序员获取表示类的对象、创建实例等. 谷歌 C++ 反射。

于 2008-11-13T03:44:25.167 回答