所以,我在这里一个问题:C++包含头文件
类A需要知道B类,B类需要知道C和C类需要知道A. 它本质一个圆圈,所以我得到了定义错误。我尝试了向前的声明,但无论顶部,还是不知道底部还有什么。
我该如何处理这种情况?
感谢
大卫
所以,我在这里一个问题:C++包含头文件
类A需要知道B类,B类需要知道C和C类需要知道A. 它本质一个圆圈,所以我得到了定义错误。我尝试了向前的声明,但无论顶部,还是不知道底部还有什么。
我该如何处理这种情况?
感谢
大卫
假设这个使用指针是简单的东西,上面亚当Mihalcin的评论是正确的,该类似的问题回答了它。但是我会把它编码出来。
假设你有这样的(方法的定义并不重要):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
然后你可以像亚当挂,只是向前delcare这样他们的所有3:
class A;
class B;
class C;
并把它放在它们全部3个之上。这里的重要事情是,这是当指针指向其他类,而不是作为类的一部分的组合。您可以使用前向声明来处理指针时正确编译的内容,但不能与其他数据类型一起编译。因此,如果有是这样的:
class D
{
B myB;
}
随着一切上面一样,你需要有“真正”的定义B的正上方为D.“真正”的定义,但剩下的可能是相同的。前向声明只适用于指针。
你必须用指针指向你的依赖循环。如果没有指针,那么数据结构是“无限的”,因此不起作用。这是因为在我的例子中,一个D 总是包含一个B.但是如果一个A总是包含一个B,而一个B总是包含一个C,而一个C总是包含一个A?那么最后的A需要另一个B,这需要另一个C,这......我希望你明白。但用指针,你可以循环它。随着组成(不是指针)它不能循环。
如果类是紧耦合的,那么你就可以
否则,您可以
但很可能你有一个设计级别的错误,如果是这样,只是解决这个问题。
你可以做的是向前声明A类在C类的头文件,那么你在.cpp文件中,你包括A类
页眉有关如何转发声明引用A级,看看这个参考 - Forward declarations in C++
最有可能的,我刚刚得到了设计级别的错误。然而,如果你必须这样做,例如,试着通过声明一个空的类A,B而不用在C的头文件中提供任何细节实现来利用前向声明。那么当你需要使用它们时,在C的实现文件中包含A和B的头文件。
记住,U只能在C类的声明
在你的头文件使用未来建设:
#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//
和所有包含文件(除自Myclass.hpp)应该在类的头文件Myclass.hpp。他必须包含在Myclass.cpp文件中。
您首先打破循环依赖关系。对于类似的问题,请参阅[此SO回答](http://stackoverflow.com/q/4110479/960195)。 – 2012-04-10 03:12:52
你是什么意思,“什么是顶部,不知道什么在底部?”头文件中的 – cloudygoose 2012-04-10 03:17:06
表示按照该顺序声明:class A,B C。 A仍然需要知道B或C,但是因为它在顶部,所以不能使用它们。如果这是有道理的。 – dajee 2012-04-10 03:18:33