【发布时间】:2012-02-20 11:38:49
【问题描述】:
我读到了 c++ 中的结构,它不能包含自身的实例。 谁能帮我理解为什么它不能包含自身的实例?
【问题讨论】:
-
结构有多大?
我读到了 c++ 中的结构,它不能包含自身的实例。 谁能帮我理解为什么它不能包含自身的实例?
【问题讨论】:
因为它会占用“无限”存储空间,因为它在初始化时会递归初始化自身。但是,您可以存储指向相同结构的指针。
例如这是无效的:
struct a
{
int someVar;
a bad;
};
这是有效的(假设你想要这个结构的链表):
struct a
{
int someVar;
a* good;
};
【讨论】:
因为要创建它的实例,您需要创建变量,它本身就是它的一个实例 - 它将调用构造函数。
这将导致对构造函数的无限递归调用。
假设class A 有一个名为a 的实例变量:
调用A 的构造函数将导致a 的初始化,它本身就是一个A。为此 - 将再次调用 A 的构造函数。
请注意,它甚至不会编译,因为编译器无法为其分配内存,它不知道为每个对象分配多少空间。存储实例变量a需要多少空间? [任何有限的空间都是不够的,因为总会有一个额外的变量也需要分配]
【讨论】:
A 没有其他数据成员或占用空间的基类,任何大小都可以使用。但仅在无用的情况下才允许这样做是不值得的。
struct S{ int data; S* next; }
class A { A a; } 表示引用了A,而不是对象本身。这意味着您无需在其中分配A,您的构造函数也不必分配(并递归调用其构造函数)。
struct bedroom
{
bed b;
table t;
bedroom r;
};
您现在看到问题了吗?一间卧室需要存储无限量的床和桌子。
【讨论】:
因为那样会导致无限递归。例如
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 的解。
【讨论】: