为什么结构不能包含自身的实例? 我读到C++中的结构,它不能包含自身的实例。 有人能帮我理解为什么它不能包含自身的实例吗?
因为要创建它的实例,您需要创建变量,它本身就是它的实例,它将调用构造函数 这将导致对构造函数的无限递归调用 假设为什么结构不能包含自身的实例? 我读到C++中的结构,它不能包含自身的实例。 有人能帮我理解为什么它不能包含自身的实例吗?,c++,structure,C++,Structure,因为要创建它的实例,您需要创建变量,它本身就是它的实例,它将调用构造函数 这将导致对构造函数的无限递归调用 假设class A有一个名为A的实例变量: 调用A的构造函数将导致A的初始化,它本身就是A。为此,将再次调用A的构造函数 注意,它甚至不会编译,因为编译器无法为它分配内存,它不知道为每个对象分配多少空间。存储实例变量a需要多少空间?[任何有限的空间都是不够的,因为总会有一个额外的变量需要分配]因为这样它会占用“无限”存储空间,因为当初始化它时,它会递归地初始化自己。但是,您可以存储指向相
class A
有一个名为A
的实例变量:
调用
A
的构造函数将导致A
的初始化,它本身就是A
。为此,将再次调用A
的构造函数
注意,它甚至不会编译,因为编译器无法为它分配内存,它不知道为每个对象分配多少空间。存储实例变量
a
需要多少空间?[任何有限的空间都是不够的,因为总会有一个额外的变量需要分配]因为这样它会占用“无限”存储空间,因为当初始化它时,它会递归地初始化自己。但是,您可以存储指向相同结构的指针
e、 g.这是无效的:
struct a
{
int someVar;
a bad;
};
这是有效的(假设您想要此结构的链接列表):
因为这样会导致不合适的递归。e、 g
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
没有任何解
struct bedroom
{
bed b;
table t;
bedroom r;
};
你现在看到问题了吗?卧室需要存储无限多的床和桌子。阅读:结构有多大?“存储实例变量A需要多少空间”-作为一种特殊情况,只要
A
没有其他占用空间的数据成员或基类,任何大小都可以工作。但是,只有在无用的情况下才允许它是不值得的。应该指出的是,您可以动态创建实例并将指向它的指针存储在同一个结构中,基本上创建一个转发列表struct S{int data;S*next;}
java是如何工作的?@Learner java对象分配是引用class A{A;}
表示存在对A
的引用,而不是对象本身。这意味着你不需要在它里面分配A
,你的构造函数也不需要分配(并递归调用它的构造函数)。但它一直都是乌龟!你在卧室里的桌子上干什么?“SBI:把我的C++书籍放在上面?”弗莱德:“你不把它们放在枕头下面吗?”FredOverflow:你不必总是把它们都放在卧室里。此外,半坐式睡觉对你的头饰也有好处。
struct bedroom
{
bed b;
table t;
bedroom r;
};