【发布时间】:2012-07-19 00:43:55
【问题描述】:
我有一个圆形标题问题,与这里已经问过的大多数问题不同。我有两个相互依赖的类,但不是成员,所以不要遇到编译器无法计算类大小的问题。所以我可以使用前向声明来打破循环。
但是,我不希望客户端必须包含这两个标头才能使用我的类。标头应该是自包含的,因此用户不需要知道这种依赖关系。有没有办法做到这一点?
编辑:棘手的部分是 A 和 B 必须只定义标题。
在标题 A.hpp 中
#ifndef A_HPP
#define A_HPP
#include "B.hpp"
struct A
{
B foo() { ... }
};
#endif
在标题 B.hpp 中
#ifndef B_HPP
#define B_HPP
struct A;
struct B
{
void bar()
{
A a = A();
...
}
};
#endif
在 main.cpp 中
#include "B.hpp"
B().bar(); // error: 'a' uses undefined class 'A'
【问题讨论】:
-
如果
A.hpp包含B.hpp,为什么不在main.cpp中包含A.hpp而不是B.hpp? -
A实际上是B的内部实现细节。我真的不希望客户对此有所了解 -
B是否应该是仅标头实现?不然为什么头文件里有bar的代码? -
我想说实际上将课程移至
B.hpp,然后如果属于B。
标签: c++ header-files