C++ 在C++;你可以有一个指向函数的指针,也可以有一个指向类的指针吗?

C++ 在C++;你可以有一个指向函数的指针,也可以有一个指向类的指针吗?,c++,class,pointers,C++,Class,Pointers,我不是说指向实例的指针,我想要指向类本身的指针。不。指针是计算机运行时内存中某个对象的地址。类只是编译器的一组指令。是和否。这取决于您试图实现的内容的上下文。如果您只是想要一个指向类型的指针,那么没有办法。类型不存在于指针意义上的内存中 有理由说是的,但是有些人会认为虚拟表是一种类型的指针。可以获取此指针,因为虚拟表确实存在于内存中,并且可以通过一些技巧来调用虚拟方法 Type信息> /Cube >实例。< P>不同于真正的基于对象的语言,一个类不是C++中的对象,更是遗憾。最接近“类指针”的是

我不是说指向实例的指针,我想要指向类本身的指针。

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

是和否。这取决于您试图实现的内容的上下文。如果您只是想要一个指向类型的指针,那么没有办法。类型不存在于指针意义上的内存中


有理由说是的,但是有些人会认为虚拟表是一种类型的指针。可以获取此指针,因为虚拟表确实存在于内存中,并且可以通过一些技巧来调用虚拟方法 Type信息> /Cube >实例。

< P>不同于真正的基于对象的语言,一个类不是C++中的对象,更是遗憾。最接近“类指针”的是RTTI:

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

type_info有name()成员finction,可以相互比较。

不存在“类”。你唯一能指出的就是数据

“类”的其余部分实际上是一个分派表。对于类中的每个方法,分派表都有一个指针。这样,不管类当前被强制转换为什么类型,它都会指向类的正确方法。这将是无用的访问

类中的方法(分派表所指向的对象)实际上只是在类数据指针中传递的“函数”。方法的定义相当于一个函数,它将类数据作为参数。在大多数C风格语言中,该数据指针是隐藏的,但称为“this”


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

正如其他人所说,不可能有指向类的指针


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

不能有类(运行时)指针,但C++确实有类似的编译时概念:有一个专用于操作指针的库和一个用于获取类信息的库。

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

真的,在C++中不支持反射/内省,但是有许多库会添加很多EG java的类功能,并允许程序员获取一个对象,表示一个类,创建一个实例,等等。谷歌C++反射。< /P>有一个小问题:一个类在使用多重继承时可以有多个虚拟表。另外,如果一个类继承了另一个类,但没有更改任何虚拟方法,我相信没有什么可以阻止编译器合并这两个类的虚拟表。就我个人而言,我不认为这是一种类型的指针,但很多人这样做,我认为我会把它发布到完整的SIFF中,甚至是可能的,它不是,一个类指针到底有什么好处?@ Jim Buck:传递它,用它来实例化类的新实例,找出它的成员,和其他所有有趣的事情,你在java中用java. Lang.Calm .Ah,是的,你需要反射,C++中也不存在。哪些语言是我可以有对象的对象,对象的类型是对象(不是表示类型的对象,也不是表示类型的工厂,但实际上是类型)我肯定知道的是Smalltalk。Java试图用getClass()实现,但不一致。@arkadly反射(getClass)与您描述的非常不同。通过反射,您有一个表示类型元数据的对象。(类型是运行时的东西,类是编译时的东西,至少在C++/Java/C#等人中是这样)。Smalltalk您可能就在那里,但我记得它更像是对所述类的编译,而不是对象所代表的类。SimultLoad是基于对象的,不是基于类的(与C++是基于类的),我同意你的说法,但是我必须给出一个有点实用的答案,java是所有使用广泛的语言中最接近的。也许Python是另一个候选者,也有不足之处。Simultalk中的类确实远不如java或C++重要。