链表实现的鸡和蛋困境

Chicken and egg dilemma with linked list implementation

本文关键字:困境 实现 链表      更新时间:2023-10-16

我主要学习了C++上下文中的链表。以下是节点实现

struct node
{
  int data;
  node* next;//node IS what is being defined
};

有人告诉我,C++标准对此有一个特殊的例外,因为有一个自引用,其中被定义的结构有一个成员本身,这是一个问题,因为它没有完全定义。为什么这是可能的?这让我在面试问题上搞砸了,我需要知道其他语言是否支持这一点。例如,我看到了一个Java实现

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在Link的实现中出现public Link nextLink;的情况下也会出现某种"特殊异常"。一般来说,大多数编程语言都有这个功能吗?什么时候可以使用?

所以你总是被允许拥有:

struct X{
 X* y;
};

以及Plublic类X{公共X y;}

为什么这不可能?类型为Link的字段只是一个引用,这也不例外。

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

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

旁注:顺便说一句,鸡蛋在鸡之前,来自一只不完全是鸡的鸟

这里没有真正的困境。next只是指向结构的另一个"对象"的指针。类似地,Link只是对具有相同定义的另一个对象的引用。

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

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