我读到c ++中的结构,它不能包含自身的实例。 任何人都可以帮助我理解为什么它不能包含它自己的实例吗?
答案 0 :(得分:8)
因为它会占用“无限”存储,因为它在初始化时会递归地初始化。但是,您可以将指针存储到同一个结构中。
e.g。这是无效的:
struct a
{
int someVar;
a bad;
};
这是有效的(如果你想要这个结构的链表):
struct a
{
int someVar;
a* good;
};
答案 1 :(得分:6)
因为要创建它的实例,你需要创建变量,它本身就是它的一个实例 - 它将调用构造函数。
这将导致对构造函数的无限递归调用。
假设class A
有一个名为a
的实例变量:
调用A
的构造函数将导致a
的初始化,A
本身就是A
。要做到这一点 - 将再次调用a
的构造函数。
请注意,它甚至不会编译,因为编译器无法为其分配内存,也不知道为每个对象分配多少空间。存储实例变量{{1}}需要多少空间? [任何有限的空间都不够,因为总会有一个额外的变量也需要分配]
答案 2 :(得分:5)
struct bedroom
{
bed b;
table t;
bedroom r;
};
你现在看到问题了吗?卧室需要存放无限量的床和桌子。
答案 3 :(得分:3)
因为那样会导致无限递归。 e.g。
struct foo
{
int boo;
foo f;
};
foo f;
foo
将包含foo
,其中包含foo
等...
要解决它,你应该使用指针:
struct foo
{
int boo;
foo* f;
};
答案 4 :(得分:1)
不仅仅是结构中不能使用任何不完整的数据类型。 假设你有一个结构A,并且你已经包含了与成员相同的结构,现在当编译器试图为它分配内存时,它如何知道要分配多少,因为你已经在其中声明了尚未完全定义的结构A.它会抛出一个不允许的错误不完整的数据类型。
答案 5 :(得分:1)
正如其他答案所指出的,结构不能包含自身的实例,因为在创建结构时会导致无限递归。但是结构可以包含指向自身的指针:
struct foo
{
int boo;
foo *f;
};
foo f;
f.f = &f;
答案 6 :(得分:1)
因为不可能为这种结构创建内存布局。如果struct foo
包含int
和foo
,您如何将sizeof(int)+sizeof(foo)
个字节放入sizeof(foo)
字节?等式A+B=A
没有A,B > 0
的任何解决方案。