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

Why structure can not contain Instance of itself?

本文关键字:实例 包含自 结构 不能 为什么      更新时间:2023-10-16

我在 c++ 中读到结构,它不能包含自身的实例。谁能帮我理解为什么它不能包含自己的实例?

因为那样它会占用"无限"的存储空间,因为当它初始化时,它会递归地初始化自己。但是,您可以存储指向同一结构的指针。

例如,这是无效的:

struct a
{
    int someVar;
    a bad;
};

这是有效的(比如如果你想要这个结构的链表(:

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

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

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

假设class A有一个名为 a 的实例变量:
调用A的构造函数将导致a的初始化,这本身就是一个A。为此 - 将再次调用 A 的构造函数。

请注意,它

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

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

你现在看到问题了吗?一间卧室需要存储无限数量的床和桌子。

因为那样会导致 inifite 递归。

例如
struct foo
{
    int boo;
    foo f;
};
foo f;

foo将包含一个包含foo等的foo...

要绕过它,您应该使用指针:

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

不仅仅是结构,任何不完整的数据类型都不能在其中使用。假设您有一个结构 A 并且您已经包含与成员相同的结构,现在当编译器尝试为其分配内存时,它如何知道要分配多少,因为您在其中声明了尚未完全定义的结构 A,它将抛出一个错误不完整的数据类型不允许。

正如其他答案所指出的,结构不能包含自身的实例,因为这会导致创建结构时无限递归。 但是,结构可以包含指向自身的指针:

struct foo
{
    int boo;
    foo *f;
};
foo f;
f.f = &f;

因为不可能为这种结构创建内存布局。如果一个struct foo包含一个int和一个foo,你如何将sizeof(int)+sizeof(foo)字节放入sizeof(foo)字节中?方程A+B=A没有任何A,B > 0解。