我不是在谈论指向实例的指针,我想要一个指向类本身的指针。
答案 0 :(得分:17)
在C ++中,类不是“first class objects”。您可以获得的最接近的是指向其type_info
实例的指针。
答案 1 :(得分:5)
没有。指针是运行时计算机内存中某些内容的地址。类只是编译器的一组指令。
答案 2 :(得分:4)
正如其他人已经说过的那样,指向一个班级的指针是不可能的。
但是,如果要从运行时选择的某个类创建一个新实例,您可能需要查看Factory Method(或Abstract Factory)设计模式。
答案 3 :(得分:1)
是和否。这取决于您要实现的目标。如果您只是想要一个指向类型的指针,那么就没有办法了。 类型在指针意义上不存在于内存中。
有理由我说是的,但有些人会认为虚拟表是一个类型的指针。由于虚拟表确实存在于内存中,因此可以使用此指针,并且可以使用一些技巧来调用虚拟方法。
答案 4 :(得分:1)
与真正的基于对象的语言不同,类不是C ++中的对象,更可惜的是。你最接近“指向类的指针”的是RTTI:
const std :: type_info& info = typeid(object expression);
type_info具有name()成员结构,可以相互比较。
答案 5 :(得分:1)
“类”不存在。你唯一可以指出的是数据。
“类”的其余部分实际上是一个调度表。对于类中的每个方法,dispatch表都有一个指针。这样,无论当前的类型是什么类型,类都指向类的正确方法。这对访问来说毫无用处。
类中的方法(调度表指向的东西)实际上只是在类数据指针中传递的“函数”。方法的定义几乎就是将类数据作为参数的函数。在大多数C风格的语言中,该数据指针被隐藏但被称为“this”。
您的类的方法可能遍布整个代码库。由于父类,您甚至不可能找到彼此相邻的这些方法。
答案 6 :(得分:1)
您不能拥有指向类的(运行时)指针,但C ++确实具有类似的编译时概念:template parameters。 Boost有一个library致力于操纵它们,还有一个traits库来获取有关课程的信息。
答案 7 :(得分:0)
根据你想要如何思考指针,你可以有一个类的“指针”,如果用指针你的意思是一个整数值。 Boost允许您注册类型并为您注册的每种类型分配唯一的整数。如果您注册的类型都是类,则可以在运行时查找创建所需类型对象所需的代码,只要您具有所需类型的值即可。但一般来说,类不是语言中的第一类对象,你可以期望的最好的是模拟你想要的行为。
答案 8 :(得分:0)
确实,内置于C ++中不支持反射/内省,但是有许多库会添加许多例如java的类功能,并允许程序员获取表示类的对象,创建一个例如google c ++ reflection。