以下代码段,编译:
struct node
{
node * a; node * b; int count;
node (node * aa, node * bb, int count2){a=aa;b=bb;count=count2;}
};
我想知道为什么C ++会允许指向节点struct 内的节点的指针(也可能是一个节点本身......因为你只能取消引用它),而不是实际的节点..类似下面的东西不能编译:
struct node
{
node a; node b; int count;
node (node aa, node bb, int count2){a=aa;b=bb;count=count2;}
};
此外,稍后在我的代码中,我尝试以下列方式声明节点:
node x=new node (NULL, NULL, 0);
显然,我需要做到这样的事情:
node * x=new node (NULL, NULL, 0);
我不明白这个..为什么你需要将x声明为指针?
答案 0 :(得分:1)
考虑尝试为结构分配足够的内存。如果结构中有node
,那么节点有多大?它的大小为int
加2 * sizeof(node)
。但node
有多大?它是递归的,并且没有办法让班级A
的成员属于A
类型。这就像说一个人是由一个头,一个双臂,两条腿和一个人组成。它没有意义。
另一方面,指针始终是某个设置大小(通常为4或8个字节)。那么node
有多大?这是sizeof(int) + 2*sizeof(node*)
。
至于你的第二个问题,那就是new
在C ++中是如何运作的。它返回指向已分配对象的指针。
似乎你可能会在Java背景下遇到这个问题?在Java中,指针不会暴露给程序员。 new
关键字会返回引用,您可以将类A
的成员视为A
。但这只能起作用,因为Java中的对象实例成员实际上是引用,而不是对象本身。