链表实现的鸡和蛋困境
Chicken and egg dilemma with linked list implementation
我主要学习了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
的任何实例。它可以是这种类型的任何实例。换句话说,指针是在运行时使用的变量。它本身并不是一种类型定义,它会导致您所描述的递归类型定义。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- B/B 树的实现与使班级成为另一个班级困境的朋友有关
- C++和CRTP模式的实现与编译器困境
- 创建一个体素系统并陷入困境,发现自己需要关于如何实现它的信息
- 链表实现的鸡和蛋困境