我在 C++ 的仅头库中遇到了循环依赖问题,当使用源文件而不是使所有内容都成为头文件时,这不会是循环依赖问题。
情况是这样的:
两个类 A 和 B 有四个文件。每个类都有它的头文件(例如“A.hpp”)和它的实现文件(例如“A.tpp”)。
依赖关系如下:
- A's header 需要 B' header
- A 的 impl 需要 B 的标头
- B 的标头只需要对 A 的前向声明
- B 的 impl 需要 A 的标头
因此,在基于源的库中,按照以下源文件包含和编译的顺序,一切都会好起来的:
- B.hpp
- A.hpp
- A.tpp 或 B.tpp(这里的顺序不重要)
我的文件的结构是这样的:
A.hpp 的文件内容:
#ifndef A_H
#define A_H
#include "B.hpp"
class A { ... };
#include "A.tpp"
#endif
A.tpp 的文件内容:
#ifndef A_H
#error "Do not include this file directly."
#endif
// ... some implementations for A.hpp
B.hpp 的文件内容:
#ifndef B_H
#define B_H
class A;
class B { ... };
#include "B.tpp"
#endif
B.tpp 的文件内容:
#include "A.hpp"
#ifndef B_H
#error "Do not include this file directly."
#endif
// ... some implementations for B.hpp
所以我的问题是:有没有一种解决方案可以打破这种不必要的循环依赖关系,这种依赖关系只是因为我为我的库使用了仅标头解决方案而发生的?