您创建了一个圆形夹杂:你包括D1.h
为D2.h
,你还包括D2.h
为D1.h
。循环包容从未起作用,从未达到任何目的。
你的循环包含是类定义之间循环依赖的直接后果。在你的代码中,这两个类的定义都是相互引用的,要求这两个类的类型都是完整的(要完全定义)。这意味着无论你做什么,你的代码都是无法编译的。您需要打破类定义之间的循环依赖关系。
在你的情况下,可以通过以下方式来完成。
保持D1.h
不变,即将D2.h
保持为D1.h
,并保持类D1
的定义原样。
然而,不包括D1.h
到D2.h
而是引入D1
预先声明为D2.h
class D1;
变化D2
的定义
class D2: public B {
public:
int get(D1& d);
};
注意:不要试图去定义方法get
正确定义类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 class D2;
,以取代“细粒度” friend声明
friend int D2::get(D1&);
和D1.h
去除D2.h
列入该路径。
前朋友声明要求类D2
是完整的,这实际上是创建“不可破坏”的依赖关系。后面的声明不需要D2
是完整的。
来源
2012-08-16 16:11:10
AnT
感谢man ...'get()'的定义其实是最初的问题(但是不知道,那么我在这两个类中都包含了.h文件)。从来没有想到这一点。 – scarably 2012-08-16 16:20:54
不,实际上......我可以通过在D2内部创建'int get_d1(){return a}'和'int get(D1&x)'{{return x.get_d1();}'来重新设计代码。 。但我认为第一个版本更好? – scarably 2012-08-16 16:36:08
stefaneli31:是的,这就是我所说的“重新思考设计”和“不需要朋友声明”。 – AnT 2012-08-16 16:42:36