2008-11-13 60 views
7

我不是在谈论一个实例的指针,我想要一个指向类本身的指针。在C++中你可以有一个指向函数的指针,你也可以有一个指向类的指针吗?

+0

如果甚至有可能,那不是,指向类的指针甚至会有什么好处? – 2008-11-13 00:17:13

+0

@Jim Buck:传递它,用它来实例化类的新实例,找到它的成员,以及在Java中使用java.lang.Class进行的所有其他有趣的事情。 – CesarB 2008-11-13 00:24:25

+0

啊,是的,你需要在C++中不存在的反射。 – 2008-11-13 01:00:39

回答

17

在C++中,类不是“first class objects”。您可以得到的最接近的是一个指向其实例type_info的指针。

5

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

1

是和否这取决于你想要实现的内容。如果你只是想要一个指向类型的指针那么没有没有办法。 A 类型不是以指针的形式存在于内存中。

有理由我说是的,但有些人会认为虚拟表格是指向某种类型的指针。有可能得到这个指针,因为虚拟表存在于内存中,并且可以用来调用具有一定欺骗性的虚拟方法。

1

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

const std :: type_info & info = typeid(object expression);

type_info具有name()成员finction,并且它们可以相互比较。

1

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

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

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

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

4

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

但是,如果要从运行时选择的某个类创建新实例,可能需要查看Factory Method(或Abstract Factory)设计模式。

1

您不能拥有指向某个类的(运行时)指针,但C++的编译时间概念相似:template parametersBoost有一个library致力于操纵他们和traits库获取有关类的信息。

0

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

0

的确,在C++中不支持反射/自省,但是有很多库会添加许多例如Java的Class功能,并允许程序员获取表示类的对象,创建一个实例等google C++反射。

相关问题