我主要在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; }
答案 0 :(得分:2)
为什么这不可能?类型Link
的字段只是一个引用,这不是特殊的例外。
在您的情况下,引用是与定义的对象类型相同的对象,但内存中没有递归,因为引用只是一个指针。因此,没有技术问题。
你也可以说在类声明中,类没有完全定义,但你使用引用的对象的方法和字段。但这与在类声明中使用this
的方法和字段,甚至在它们自己的声明之前使用方法完全相同。 编译器一直处理它,不用担心。
旁注:顺便说一句,鸡蛋来自鸡,来自一只不完全是鸡的鸡。
答案 1 :(得分:1)
这里没有真正的困境。 next
只是指向struct的另一个“对象”的指针。同样,Link
只是对同一定义的另一个对象的引用。
由于类只是对其类型的对象中包含的内容的定义,并且由于可以有许多对象,因此对于每个类定义,可以在另一个对象的对象内引用该类的对象。
答案 2 :(得分:1)
next
是指针(大小为4或8个字节,具体取决于您是否在32位与64位系统上),它将地址保存到包含实例的内存中的某个位置struct node
的。{在编译struct node
时,编译器知道类型的大小以及如何将其布置在内存中。在运行时,将为4或8字节指针分配一个指向struct node
的任何实例的值。它可以是这种类型的任何实例。换句话说,指针是在运行时使用的变量。它本身并不是一种类型定义,它会导致你描述的递归类型定义。