为什么结构不能包含自身的实例?

时间:2012-02-20 11:38:49

标签: c++ structure

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

7 个答案:

答案 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包含intfoo,您如何将sizeof(int)+sizeof(foo)个字节放入sizeof(foo)字节?等式A+B=A没有A,B > 0的任何解决方案。