问题很简单:你不能有依赖循环。
// MainScheduler.h
#ifndef MAINSCHEDULER
#define MAINSCHEDULER
#include "Job.h"
class MainScheduler { friend class Job; };
#endif
// Job.h
#ifndef JOB
#define JOB
#include "MainScheduler.h"
class Job { friend class MainScheduler; };
#endif
解析 MainScheduler.h 时发生的情况如下:
MAINSCHEDULER
未定义,因此解析开始
- 预处理器定义
MAINSCHEDULER
- 预处理器包括 Job.h
- 因为
MAINSCHEDULER
已经定义,所以它跳过 MainScheduler.h 的包含
- 它包括来自的令牌
Job
- 包括 Job.h 结束
- 它包括来自的令牌
MainScheduler
这会产生以下预处理器输出,编译器会看到:
// ignored #include "MainScheduler.h"
class Job { friend class MainScheduler; };
class MainScheduler { friend class Job; };
这就是为什么在您引入前向声明之前,编译器会抱怨MainScheduler
.Job
您的标头不能将自己包含在循环中,并且您不能仅通过前向声明与成员函数成为朋友。
我建议您将 Job.h 重写为:
class MainScheduler; // forward declaration
class Job {
friend class MainScheduler;
public:
// whatever
};
通过与全班同学交朋友,您只需提前声明即可逃脱并打破循环。