Это происходит по кругу, пока вы объявляете someCourse
и someStudent
как не указывающие члены класса Student
и Course
соответственно (как вы сделали), потому что компилятор видит определение 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
Также обратите внимание, что когда вы объявляете pSomeCourse
как указатель типа Course*
, вам не нужно включать заголовочный файл, в котором определен Course
. Достаточно просто переслать объявление класса Course
, как я делал в приведенном выше коде.
Причина, по которой это работает, потому что размер указателя любого класса одинаков, и компилятору не нужно знать размер класса, чтобы узнать размер указателя того же класса. Другими словами, компилятор может знать sizeof(Course*)
, даже не зная sizeof(Course)
.