用链表实现鸡和蛋的困境 我主要是在C++环境中学习链表。下面是一个节点实现 struct node { int data; node* next;//node IS what is being defined }; class Link { public int data1; public double data2; public Link nextLink; //Link constructor public Link(int d1, double d2) { data1 = d1; data2 = d2; } //Print Link data public void printLink() { System.out.print("{" + data1 + ", " + data2 + "} "); } 我被告知,C++标准对此有特殊的例外,因为有一个自引用,其中定义的结构有一个成员本身,这是一个问题,因为它没有完全定义。为什么这是可能的?这让我在面试问题上搞砸了,我需要知道其他语言是否支持这一点。例如,我看到了一个Java实现 struct node { int data; node* next;//node IS what is being defined }; class Link { public int data1; public double data2; public Link nextLink; //Link constructor public Link(int d1, double d2) { data1 = d1; data2 = d2; } //Print Link data public void printLink() { System.out.print("{" + data1 + ", " + data2 + "} "); }

用链表实现鸡和蛋的困境 我主要是在C++环境中学习链表。下面是一个节点实现 struct node { int data; node* next;//node IS what is being defined }; class Link { public int data1; public double data2; public Link nextLink; //Link constructor public Link(int d1, double d2) { data1 = d1; data2 = d2; } //Print Link data public void printLink() { System.out.print("{" + data1 + ", " + data2 + "} "); } 我被告知,C++标准对此有特殊的例外,因为有一个自引用,其中定义的结构有一个成员本身,这是一个问题,因为它没有完全定义。为什么这是可能的?这让我在面试问题上搞砸了,我需要知道其他语言是否支持这一点。例如,我看到了一个Java实现 struct node { int data; node* next;//node IS what is being defined }; class Link { public int data1; public double data2; public Link nextLink; //Link constructor public Link(int d1, double d2) { data1 = d1; data2 = d2; } //Print Link data public void printLink() { System.out.print("{" + data1 + ", " + data2 + "} "); },java,c++,standards,Java,C++,Standards,} 因此,这似乎支持Java做出某种“特殊例外”,以及public Link nextLink发生在链接的实现中。一般来说,大多数编程语言都有这个功能吗?什么时候可以使用 因此,始终允许您拥有: struct X{ X* y; }; 及 复数类X { 公共X y; }为什么这不可能?类型为Link的字段只是一个参考,没有特殊的例外 在您的例子中,引用是指向与所定义对象类型相同的对象,但是内存中没有递归,因为引用只是一个指针。因此,没有技术问题 您还可以说,在类声明中,类没有完全定义,但是您使

}

因此,这似乎支持Java做出某种“特殊例外”,以及
public Link nextLink发生在
链接
的实现中。一般来说,大多数编程语言都有这个功能吗?什么时候可以使用

因此,始终允许您拥有:

struct X{
 X* y;
};
及 复数类X { 公共X y;
}为什么这不可能?类型为
Link
的字段只是一个参考,没有特殊的例外

在您的例子中,引用是指向与所定义对象类型相同的对象,但是内存中没有递归,因为引用只是一个指针。因此,没有技术问题

您还可以说,在类声明中,类没有完全定义,但是您使用了被引用对象的方法和字段。但这与在类声明中使用
this
的方法和字段完全相同,甚至在它们自己的声明之前使用方法编译器一直在处理它,不用担心


旁注:顺便说一句,鸡蛋先于鸡,来自一只不完全是鸡的鸟。

为什么不可能呢?类型为
Link
的字段只是一个参考,没有特殊的例外

在您的例子中,引用是指向与所定义对象类型相同的对象,但是内存中没有递归,因为引用只是一个指针。因此,没有技术问题

您还可以说,在类声明中,类没有完全定义,但是您使用了被引用对象的方法和字段。但这与在类声明中使用
this
的方法和字段完全相同,甚至在它们自己的声明之前使用方法编译器一直在处理它,不用担心


旁注:顺便说一句,鸡蛋先于鸡,来自一只不完全是鸡的鸟。

这里没有真正的困境。下一个
只是指向struct的另一个“对象”的指针。类似地,
Link
只是对同一定义的另一个对象的引用


由于类只是其类型的对象中所包含内容的定义,并且可以有许多对象,因此对于每个类定义,可以在另一个类的对象中引用该类的对象。

这里没有真正的难题。下一个只是指向struct的另一个“对象”的指针。类似地,
Link
只是对同一定义的另一个对象的引用


由于类只是其类型的对象中所包含内容的定义,并且可以有许多对象,因此对于每个类定义,可以在另一个类的对象中引用该类的对象。

下一个
是指针(大小为4或8字节,取决于您是在32位还是64位系统上)它保存内存中包含
结构节点的实例的位置的地址。编译
struct节点时,编译器知道类型的大小以及如何在内存中布局。在运行时,将为4或8字节指针分配一个值,该值指向
结构节点的任何实例。它可以是这种类型的任何实例。换句话说,指针是运行时使用的变量。它本身并不是一种类型定义,它不会导致您所描述的递归类型定义。

下一步
是一个指针(大小为4或8字节,取决于您是在32位还是64位系统上),它持有指向内存中包含
结构节点实例的位置的地址。编译
struct节点时,编译器知道类型的大小以及如何在内存中布局。在运行时,将为4或8字节指针分配一个值,该值指向
结构节点的任何实例。它可以是这种类型的任何实例。换句话说,指针是运行时使用的变量。它本身并不是一种类型定义,它不会像您所描述的那样导致递归类型定义。

这里没有困境,也没有特例<代码>下一步
是一个参考/指针。我认为你被教错了。这里没有“特殊例外”。C++中的一个类可以有一个指向任何类的指针,作为它的一个字段的类型,而不仅仅是它自己。类似地,Java中的类可以将任何类作为其字段的类型。在C++中你不能拥有的是一个类,其中一个字段是同一个类,也就是不是一个指针。然而,这在许多现代编程语言中得到了很好的支持(甚至可能是大多数?),因此不再那么特殊<代码>下一步
是一个参考/指针。我认为你被教错了。这里没有“特殊例外”。C++中的一个类可以有一个指向任何类的指针,作为它的一个字段的类型,而不仅仅是它自己。类似地,Java中的类可以将任何类作为其字段的类型。在C++中你不能拥有的是一个类,其中一个字段是同一个类,也就是不是一个指针。