我不是在谈论一个实例的指针,我想要一个指向类本身的指针。在C++中你可以有一个指向函数的指针,你也可以有一个指向类的指针吗?
回答
在C++中,类不是“first class objects”。您可以得到的最接近的是一个指向其实例type_info
的指针。
不。指针是运行时计算机内存中某物的地址。一个类只是一组编译器的指令。
是和否这取决于你想要实现的内容。如果你只是想要一个指向类型的指针那么没有没有办法。 A 类型不是以指针的形式存在于内存中。
有理由我说是的,但有些人会认为虚拟表格是指向某种类型的指针。有可能得到这个指针,因为虚拟表存在于内存中,并且可以用来调用具有一定欺骗性的虚拟方法。
与真正的基于对象的语言不同,类不是C++中的对象,更可惜。您可以最接近“指向类”RTTI:
const std :: type_info & info = typeid(object expression);
type_info具有name()成员finction,并且它们可以相互比较。
“Class”不存在。唯一可以指出的是数据。
“类”的其余部分实际上是一个调度表。对于类中的每个方法,调度表都有一个指针。这样,无论当前类型转换为什么类型,该类都会指向您的类的正确方法。这将是无用的访问。
你的类中的方法(调度表指向的东西)实际上只是在你的类数据指针中传递的“函数”。方法的定义非常多,它是一个将类数据作为参数的函数。在大多数C语言风格的语言中,该数据指针是隐藏的,但被称为“this”。
你的类的方法可能遍布整个代码库。由于父类,你甚至不可能发现这些方法彼此相邻。
正如其他人已经说过的,不可能有指向类的指针。
但是,如果要从运行时选择的某个类创建新实例,可能需要查看Factory Method(或Abstract Factory)设计模式。
您不能拥有指向某个类的(运行时)指针,但C++的编译时间概念相似:template parameters。 Boost有一个library致力于操纵他们和traits库获取有关类的信息。
根据你想要如何考虑指针,你可以有一个指向类的指针,如果你指的是指向一个整数值。 Boost允许您注册类型并为您注册的每种类型分配一个唯一的整数。如果你注册的类型都是类,那么你可以在运行时查看创建你想要的类型的对象所需的代码,只要你有你想要的类型的值。但是总的来说,类不是语言中的第一类对象,你所希望的最好的方式就是模拟你想要的行为。
的确,在C++中不支持反射/自省,但是有很多库会添加许多例如Java的Class功能,并允许程序员获取表示类的对象,创建一个实例等google C++反射。
- 1. 函数可以返回一个指向NULL的指针吗?
- 2. 一个类内的指针可以指向这个吗?
- 3. 是否有可能有一个指针指向第一个指针所指向的变量的指针?
- 4. 函数指针指向一个函数指针的函数
- 5. 你可以在C++中声明一个指针作为extern吗?
- 6. 你可以改变指针指向的大小
- 7. C - 你如何从一个指向指向该值的指针访问值?
- 8. 将指针指向类函数以指向函数
- 9. 指针数组和指针指向一个数组在C++
- 10. C - fscanf - 你可以向前移动文件指针吗?
- 11. 为什么有人需要一个指向指针的指针?
- 12. 传递指向C++中另一个指针的'const'指针
- 13. UML:当一个类具有指向其他类的指针参数指针时
- 14. 在Delphi中保存一个指向指定函数的指针
- 15. 是否可以定义一个指向构造函数的函数指针?
- 16. 是否可以指向类成员的Typedef函数指针?
- 17. C++ - 指向数组的指针 - 指针
- 18. 你可以在堆上声明一个指针吗?
- 19. 当你有一个指向结构体指针的指针时,你如何使用realloc?
- 20. C++指向类的指针
- 21. 指向指针的指针和指向数组的指针
- 22. 一个指向数组的指针
- 23. 指向函数的指针
- 24. C++ - 你如何从一个类中获得“指向自我”的指针?
- 25. 有一个模板参数可以是指针类型或非指针类型
- 26. 如何定义一个可以返回指向自己的指针的函数?
- 27. C#指向变量的指针 - 我可以避免它吗?
- 28. 添加到函数指针,获取指向另一个函数的指针?
- 29. PHP - 可以返回一个指针吗?
- 30. 指向C++指针的指针
如果甚至有可能,那不是,指向类的指针甚至会有什么好处? – 2008-11-13 00:17:13
@Jim Buck:传递它,用它来实例化类的新实例,找到它的成员,以及在Java中使用java.lang.Class进行的所有其他有趣的事情。 – CesarB 2008-11-13 00:24:25
啊,是的,你需要在C++中不存在的反射。 – 2008-11-13 01:00:39