【问题标题】:In C++ You Can Have a Pointer to a Function, Can you also have a pointer to a class?在 C++ 中你可以有一个指向函数的指针,你也可以有一个指向类的指针吗?
【发布时间】:2010-09-22 02:27:06
【问题描述】:

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

【问题讨论】:

  • 如果有可能,但事实并非如此,指向类的指针有什么好处?
  • @Jim Buck:传递它,使用它来实例化类的新实例,找出它的成员,以及您在 Java 中使用 java.lang.Class 所做的所有其他有趣的事情。
  • 啊,是的,你需要反射,这在 C++ 中也不存在。

标签: c++ class pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这有一个小问题:一个类在使用多重继承时可以有多个虚拟表。此外,如果一个类从另一个类继承但不更改任何虚拟方法,我相信没有什么能阻止编译器合并两个类的虚拟表。
        • 是的,但您仍然可以获得指向它的指针。就我个人而言,我不认为这是指向类型的指针,但很多人都这样做,所以我想我会为了完整性发布它
        【解决方案5】:

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

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

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

        【讨论】:

        • 在哪些语言中我可以拥有一个对象,其中该对象的类型是一个对象(不是表示类型的对象,也不是所述类型的工厂,而是它实际上是类型)?
        • 我肯定知道的是 Smalltalk。 Java 尝试使用 getClass() 来实现,但不一致。
        • @arkadly 反射(getClass)与您描述的非常不同。通过反射,您有一个表示有关类型的元数据的对象。 (类型是运行时事物,类是编译时事物,至少在 C++/Java/C# 等中是这样)。 Smalltalk 你可能就在那里,但我记得它更像是对所述类的编译,而不是对象所代表的类。 Smalltalk 是基于对象而不是基于类(与基于类的 C++ 相反)
        • 我同意你的说法,但我必须给出一个有点实际的答案,Java 是所有广泛使用的语言中最接近的。可能 Python 是另一个候选者,但也不足。 Smalltalk 中的类确实远不如 Java 或 C++ 重要——非常正确。
        【解决方案6】:

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

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

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

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

        【讨论】:

          【解决方案7】:

          您不能拥有指向类的(运行时)指针,但 C++ 确实有类似的编译时概念:template parametersBoost 有一个 library 专门用于操作它们,还有一个 traits 库用于获取有关类的信息。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-02-16
                • 1970-01-01
                • 1970-01-01
                • 2016-08-11
                • 2015-09-12
                • 2013-08-24
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多