【问题标题】:Why can we make a pointer variable of a class which is forward declared and not make an object of that class?为什么我们可以为一个前向声明的类创建一个指针变量而不是该类的一个对象?
【发布时间】:2015-12-13 06:15:14
【问题描述】:

例如:

@class X 
interface Y: NSObject
{ 
X *x;  //correct
X x;    //incorrect
}

为什么会这样?在指针的情况下,它如何知道指向哪里? 谢谢

【问题讨论】:

  • Objective-C 不支持X x,即使X 不是前向声明。在 Objective-C 中对对象的所有引用都必须是指针。

标签: objective-c forward-declaration


【解决方案1】:

困惑的根源似乎是你的问题:

在指针的情况下它如何知道指向哪里?

声明时问问自己:

int x;

它如何知道给x 赋予什么价值?您已经声明了一个名称为x变量,它是某种类型的int,并且一个变量是一个 的容器。价值是多少?

根据变量的语言和种类(全局、本地、实例等),两个常见答案是 (a) 未定义 - 您不能依赖的任意东西和 (b) 类型的零 - @987654325 @为上述int。答案是不是 (c) 一些特定的值,比如42

现在让我们看看你的问题中的声明:

X *x;

您有一个变量,其名称为x,属于某种类型,X *,问题是该变量中将放置什么值。那么现代(ARC)Objective-C 是否为X * 选择(a)或(b),其中X 是一个类类型?它选择 (b),X * 的零是nil。如上所述,答案是not (c),一个指向X 的特定实例的指针。

换句话说就是你问题的答案

在指针的情况下它如何知道指向哪里?

它没有指向任何地方,使用零指针值,又名nil

转到您的问题引起的第二个问题,您还声明:

X x;

其中X 是一个类类型,注意它是不正确的。在 Objective-C 中,所有类的实例都必须通过指针来引用,没有“值类”——如果你需要那些你可以使用结构的实例 (struct)。

HTH

【讨论】:

    【解决方案2】:

    指针只是一个指针。无论它指向什么,它都有固定的大小。所以它的 type 仅仅作为一个额外的信息(作为一种演员表)。如果你搞砸了,这将在运行时显示。

    另一方面:编译器需要确切的类footprint来创建该类的实例。

    编辑:正如 rmaddy 在 cmets 中指出的那样,在任何情况下,Objective-C 都不支持您的 X x; 代码行:您将始终处理指向实例/对象的(某种级别的)指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-09
      • 2020-01-22
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多