鸡肉和鸡蛋困境与链表实施

时间:2014-04-11 07:58:26

标签: java c++ standards

我主要在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做出某种特殊例外"以及public Link nextLink;Link的实现中发生的位置。一般来说大多数编程语言都有这个功能吗?什么时候可以使用?

所以你总是被允许:

struct X{
 X* y;
};

和     Plublic类X.     {       公共X y;     }

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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