Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么结构不能包含自身的实例? 我读到C++中的结构,它不能包含自身的实例。 有人能帮我理解为什么它不能包含自身的实例吗?_C++_Structure - Fatal编程技术网

为什么结构不能包含自身的实例? 我读到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;
};