C++ EventListener模式双向依赖下头文件循环包含问题如何解决?
问题结论
首先明确:绝对不要在两个类的.hpp头文件中互相#include,即便添加了#pragma once或者#ifndef系列头文件守卫也无法解决根本问题:互相包含会导致头文件展开时其中一个类的定义还未完成,直接触发「类型不完整」的编译错误。
正确处理方案
你的场景完全可以通过「头文件用前置声明+实现放到.cpp文件」的方案解决,无需互相引入头文件:
- 头文件层仅保留前置声明
- 在
entity.hpp中,不需要引入event_listener.hpp,仅需在Entity类定义前加一行前置声明class EventListener;即可。头文件中仅声明成员方法,不需要知道EventListener的完整结构,编译器只要识别到它是一个合法类类型就可以完成声明校验。 - 同理在
event_listener.hpp中,不需要引入entity.hpp,仅需前置声明class Entity;即可:方法参数用的是Entity*指针类型,只需要知道Entity是类类型就可以完成声明,不需要知道它的完整内存布局和成员定义。
- 在
- 具体方法实现放到对应的.cpp文件中,按需引入头文件
- 在
entity.cpp里,先引入entity.hpp,再引入event_listener.hpp,此时两个类的头文件都已完整加载,实现Register、ReportEvent方法时调用EventListener的接口完全符合编译要求。 - 在
event_listener.cpp里,先引入event_listener.hpp,再引入entity.hpp,实现BroadcastEvent时调用Entity的OnNotify方法也能获取到完整的类定义,不会报错。
- 在
内容的提问来源于stack exchange,提问作者Power_tile
相关产品推荐
相关产品推荐

