2012-02-20 41 views
2

我读了关于C++中的结构,它不能包含它自己的实例。 任何人都可以帮助我理解它为什么不能包含它自己的实例吗?为什么结构不能包含它自己的实例?

+1

阅读:http://stackoverflow.com/questions/588623/self-referential-struct-definition – YXD 2012-02-20 11:41:51

+3

结构有多大? – 2012-02-20 11:41:52

回答

5

因为要创建它的实例,您需要创建变量,它本身就是它的一个实例 - 它将调用构造函数。

这将导致对构造函数的无限递归调用。

假设class A有一个名为a的实例变量:
调用的A构造会造成a初始化,它本身就是一个A。要做到这一点 - A的构造函数将被再次调用。

请注意,它甚至不会编译,因为编译器无法为它分配内存,它不知道为每个对象分配多少空间。需要多少空间才能存储实例变量a? [任何有限的空间将是不够的,因为总会有一个额外的变量,也需要分配]

+1

“需要多少空间才能存储实例变量a” - 作为一种特殊情况,只要“A”没有占用空间的其他数据成员或基类,任何大小都可以工作。但是,只有在它无用的情况下,它才是值得的。 – 2012-02-20 12:03:10

+0

应该指出,你可以动态地创建一个实例,并在同一个结构中存储一个指向它的指针,基本上创建一个前向列表。 'struct S {int data; S *下一个; }' – zett42 2017-07-04 20:17:38

+0

那么java是如何工作的呢? – Learner 2017-07-05 16:53:18

6

因为那么它会占用“无限”的存储,因为它初始化时递归地初始化自己。但是,您可以将指针存储到相同的结构中。

例如这是无效的:

struct a 
{ 
    int someVar; 
    a bad; 
}; 

这是有效的(比方说,如果你想要这个结构的链接列表):

struct a 
{ 
    int someVar; 
    a* good; 
}; 
3

因为那将导致inifite递归。例如

struct foo 
{ 
    int boo; 
    foo f; 
}; 

foo f; 

foo将包含foo含有foo等等

要解决它,你应该使用指针:

struct foo 
{ 
    int boo; 
    foo* f; 
}; 
1

不只是结构的任何不完整的数据类型不能为与它一起使用。 可以说你有一个结构体A,并且你已经包含了与成员体相同的结构体,现在当编译器试图向它分配内存时,它如何知道要分配多少内存,因为你已经声明了结构体A,它尚未完全定义它会抛出错误不完整的数据类型不允许。

1

正如其他答案指出的那样,该结构不能包含自身的实例,因为这会在创建结构时导致无限递归。然而一个结构可以包含一个指针本身:

struct foo 
{ 
    int boo; 
    foo *f; 
}; 

foo f; 
f.f = &f; 
1

因为不可能创造这样的结构存储器布局。如果struct foo包含intfoo,那么如何将sizeof(int)+sizeof(foo)字节合并到sizeof(foo)字节中?等式A+B=A对于A,B > 0没有任何解决方案。

5
struct bedroom 
{ 
    bed b; 
    table t; 
    bedroom r; 
}; 

您现在看到问题了吗?一间卧室需要存放无数张床和桌子。

+1

但它一直都是龟! – StackedCrooked 2012-02-20 13:06:30

+3

你在卧室里的桌子上做什么? – sbi 2012-02-20 13:06:59

+0

@sbi:把我的C++书放在上面? – fredoverflow 2012-02-20 13:15:30

相关问题