C++包含在一个循环中

Vla*_*lad 5 c++ cycle include

请考虑以下三个简化文件:
student.h:

#ifndef STUDENT_H
#define STUDENT_H

#include "course.h"

class Student
{
private:
    Course someCourse;
};

#endif
Run Code Online (Sandbox Code Playgroud)

course.h:

#ifndef COURSE_H
#define COURSE_H

#include "student.h"

class Course
{
private:
    Student someStudent;
};

#endif
Run Code Online (Sandbox Code Playgroud)

和main.cpp:

#include "student.h"
int main();
Run Code Online (Sandbox Code Playgroud)


这不会编译给我
错误C2146:语法错误:缺少';' 在标识符'someStudent'之前

它会在更复杂的程序中产生更多错误(即使对于正确的代码部分).我猜设计是错误的:Student包含CourseCourse包含Student.我想用它代表的是一个学生需要几门课程而一门课程有几个学生(我在一个完整的程序中使用向量,为简单起见,这里避免使用它们).有什么建议怎么可能?

弗拉德,提前谢谢.

更新: 感谢您的快速回复.Student课堂上的Course课堂前向声明(以及删除#include "student.h")似乎可以胜任.对不起,我觉得这里没关系,但实际上我在每个都使用const指针的向量(因为学生不应该能够控制a Course而a Course应该不能控制a Student),如:

vector<const Student* const> students; // in Course class
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 14

这是循环的,只要你声明someCoursesomeStudent 作为类的非指针成员StudentCourse分别(正如你所做),因为编译器看到了定义Student,它需要知道它的大小反过来意味着,它需要了解其所有成员的规模,包括Course其中之一.但要知道它的大小Course,它需要知道它的大小Student.这变成了循环.

因此,您需要通过将其中至少一个声明为指针来打破此循环.例如,您可以这样做:

#ifndef STUDENT_H
#define STUDENT_H

//#include "course.h" //commenting out, as it is not needed!

class Course; //this is called forward declaration

class Student
{
private:
    Course *pSomeCourse; //pointer
};

#endif
Run Code Online (Sandbox Code Playgroud)

另请注意,当您声明pSomeCourse为类型的指针时Course*,您不需要包含Course已定义的头文件.只需转发类的声明即可Course,就像我在上面的代码中所做的那样.

它的工作原因是因为任何类的指针大小都相同,而编译器不需要知道类的大小,以便知道同一类的指针大小.换句话说,编译sizeof(Course*)甚至不知道就可以知道sizeof(Course).