【C++】循环依赖与类的前置声明
场景
- A.hpp中包含了B.hpp,而B.hpp中又包含A.hpp。是 C++ 中典型的循环依赖问题。如果 A.hpp 和 B.hpp 相互包含,直接编译会报错类型不存在。
- 两个只有 .hpp 文件的类如果互相 #include,一定会产生循环依赖。并且通常无法仅靠头文件保护解决。在纯头文件实现(header‑only)的场景下,互相包含几乎必然导致编译失败,必须通过打破循环引用或重构代码来解决(将header-only改成.hpp和.cpp)。
解决
选择一个类在头文件中进行前置声明,在.cpp文件中include另一个的头文件。
比如:选择A进行B的前置声明。若A.hpp中只是以指针/引用的形式使用B类。那么A.hpp中可以以前向声明替代include"B.hpp"。同时,将使用B类的实现,放到A.cpp中,并在A.cpp中include "B.hpp"即可。
前置声明:
- 使用的是B类的【指针或引用】,没有实际使用其成员。
- 在命名空间中的类的前置声明,要加上命名空间。
//B.hpp
namespace Config
{
class B
{
...
}
}
//A.hpp
namespace Config{class B;} //前置声明

浙公网安备 33010602011771号