您创建了一个循环包含:您包含D1.h
在D2.h
并且您还包含D2.h
在D1.h
. 循环包容永远不会奏效,也永远不会取得任何成就。
您的循环包含是类定义之间循环依赖的直接结果。在您的代码中,两个类定义以需要两个类类型都完整(完全定义)的方式相互引用。这意味着无论您做什么,都无法编译您的代码。您需要打破类定义之间的循环依赖关系。
在您的情况下,可以通过以下方式完成。
保持D1.h
不变,即保持包含D2.h
并D1.h
保持类的定义不变D1
。
但是,不要包含D1.h
intoD2.h
而是引入 into 的前向D1
声明D2.h
class D1;
将定义更改D2
为
class D2: public B {
public:
int get(D1& d);
};
注意:不要试图get
在 class 的定义中定义正确的方法D2
。您必须将的定义重新定位D2::get
到其他地方,其中完整的定义D1
也是可见的(D2.cpp
例如,应该同时包含D1.h
和D2.h
)
int D2::get(D1& d)
{
return d.a;
}
而已。定义这种方式的一个副作用D2::get
是它变得非内联。如果您真的想保持内联,则必须将其定义为
inline int D2::get(D1& d)
{
return d.a;
}
并确保它仅在. D1
例如,您可以将其放入第三个头文件(D2_aux.h
或类似的文件)中,并记住将其包含在D1.h
.
当然,尝试解决这个问题的更好方法是重新考虑整个设计。你真的需要里面的朋友声明D1
吗?也许您应该以某种方式重新设计您的代码以消除对朋友声明的需要,从而消除这种依赖性。
或者,您可以通过更改D1.h
和保持D2.h
不变来解决它。但是,要遵循该路径,您必须替换您的“细粒度”朋友声明
friend int D2::get(D1&);
具有更全面和宽容的
friend class D2;
并删除包含D2.h
from D1.h
。
以前的朋友声明要求类D2
是完整的,这实际上是创建“牢不可破”的依赖关系的原因。后一个声明不需要D2
完整。