Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++_C_Compiler Construction_Struct - Fatal编程技术网

C++ 编译器循环引用

C++ 编译器循环引用,c++,c,compiler-construction,struct,C++,C,Compiler Construction,Struct,我在代码中定义了两种类型 typedef struct Project Project; typedef struct Worker{ Project projects[10]; }Worker; struct Project{ Worker member[30]; } 编译过程引发以下错误: 数组类型的元素类型不完整 我认为是因为循环引用,当编译器试图为数组分配空间时,它不知道类型项目,如果我更改类型的定义顺序,同样的事情也会发生。 这个问题我说得对吗?最重要的是,我如何解决这个问

我在代码中定义了两种类型

typedef struct Project Project;

typedef struct Worker{
  Project projects[10];
}Worker;

struct Project{
 Worker member[30];
}
编译过程引发以下错误:

数组类型的元素类型不完整

我认为是因为循环引用,当编译器试图为数组分配空间时,它不知道类型项目,如果我更改类型的定义顺序,同样的事情也会发生。
这个问题我说得对吗?最重要的是,我如何解决这个问题?

正如注释中提到的,两种结构类型都应该包含指向另一种类型的指针。目前来看,
Project
Worker
结构都必须是无限大的,因为每个
Worker
将包含十个
Project
s,其中将包含30个
Worker
s,等等。

正如注释中提到的,这两个结构类型都应该包含指向其他类型的指针。目前,
Project
Worker
结构都必须是无限大的,因为每个
Worker
将包含10个
Project
s,其中包含30个
Worker
s,等等,编译器需要知道定义,以便定义
工作程序
。通过您对
项目
的转发声明,您只会通知编译器
项目
的存在,但它需要知道完整的定义。您可以声明一个指针,然后执行
malloc

typedef struct Project Project;

typedef struct Worker{
  Project *projects;
}Worker;

struct Project{
 Worker *member;
};
旁注:结构定义中缺少分号:

struct Project{
 Worker member[30];
};

当您声明类型为
Project
的数组时,编译器需要知道该定义,以便定义
工作者。通过您对
项目
的转发声明,您只会通知编译器
项目
的存在,但它需要知道完整的定义。您可以声明一个指针,然后执行
malloc

typedef struct Project Project;

typedef struct Worker{
  Project *projects;
}Worker;

struct Project{
 Worker *member;
};
旁注:结构定义中缺少分号:

struct Project{
 Worker member[30];
};

你说得对。您的辅助结构包含值为Project类型的成员。为了让编译器正确构造辅助对象,它需要知道它的大小。这意味着它需要有项目类型的完整定义,并且在代码中只在几行之后定义。 您可以通过在Worker struct中使用指向项目成员的引用/指针,并使用forward声明来声明它,这样编译器就知道它是一个已知类型(避免了上述问题,因为指针的大小与它指向的类型无关,所以编译器不需要完整的类型定义)

大概是这样的:

struct Project;  //forward declaration of Project type
typedef struct Worker{
  Project *projects[10];
} Worker;

struct Project{
  Worker member[30];
}

你说得对。您的辅助结构包含值为Project类型的成员。为了让编译器正确构造辅助对象,它需要知道它的大小。这意味着它需要有项目类型的完整定义,并且在代码中只在几行之后定义。 您可以通过在Worker struct中使用指向项目成员的引用/指针,并使用forward声明来声明它,这样编译器就知道它是一个已知类型(避免了上述问题,因为指针的大小与它指向的类型无关,所以编译器不需要完整的类型定义)

大概是这样的:

struct Project;  //forward declaration of Project type
typedef struct Worker{
  Project *projects[10];
} Worker;

struct Project{
  Worker member[30];
}


你想让这些课程举办什么?我同意编译器的说法,我也会在试图理解您想要的内容时崩溃。您可能希望在
Worker
中使用
Project*projects[10]
和/或在项目中使用
Worker*member[30]
。否则,关于内存布局,它如何工作?如果不指定指针,则请求将成员嵌入结构中。所以您声明了一个包含10个工人的项目,其中包含10个进一步的项目,其中包含30个工人,以此类推。递归没有终止。@ USER415162442:另一个想法是保持<代码> Works和 Project < /C> >单独地介绍一个代码>关系> <代码>类,将它们映射到彼此。这是C还是C++?你希望类保持什么?我同意编译器的说法,我也会在试图理解您想要的内容时崩溃。您可能希望在
Worker
中使用
Project*projects[10]
和/或在项目中使用
Worker*member[30]
。否则,关于内存布局,它如何工作?如果不指定指针,则请求将成员嵌入结构中。所以您声明了一个包含10个工人的项目,其中包含10个进一步的项目,其中包含30个工人,以此类推。递归没有终止。@ USER415162442:另一个想法是保持<代码> Works和 Project 分开并介绍一个将它们映射到彼此的<代码>关系> /Cux>类。它们之间没有很好的逻辑上相互牵制的理由。@nneonneo:是的,但将一个存储在另一个中可能更有效。我担心的是OO设计,而不是效率。项目中包含工人是没有意义的,因为工人可以参与多个项目;根据相似的逻辑,工作人员包含项目是没有意义的。或者,更好的是,两者都应该包含指向彼此的指针。它们之间没有很好的逻辑上相互牵制的理由。@nneonneo:是的,但将一个存储在另一个中可能更有效。我担心的是OO设计,而不是效率。项目中包含工人是没有意义的,因为工人可以参与多个项目;通过类似的逻辑,工人们不包含项目是没有意义的,这是C++;推荐
new
而不是
malloc
@nneonneo
C
标签也在那里!我知道…我讨厌人们那样做。你讨厌malloc或C/C++一起吗dTyWIFF不是一个正向声明,这是C++;推荐
新的
而不是