2012-04-10 159 views
0

所以,我在这里一个问题:C++包含头文件

类A需要知道B类,B类需要知道C和C类需要知道A. 它本质一个圆圈,所以我得到了定义错误。我尝试了向前的声明,但无论顶部,还是不知道底部还有什么。

我该如何处理这种情况?

感谢

大卫

+5

您首先打破循环依赖关系。对于类似的问题,请参阅[此SO回答](http://stackoverflow.com/q/4110479/960195)。 – 2012-04-10 03:12:52

+0

你是什么意思,“什么是顶部,不知道什么在底部?”头文件中的 – cloudygoose 2012-04-10 03:17:06

+0

表示按照该顺序声明:class A,B C。 A仍然需要知道B或C,但是因为它在顶部,所以不能使用它们。如果这是有道理的。 – dajee 2012-04-10 03:18:33

回答

2

假设这个使用指针是简单的东西,上面亚当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,这......我希望你明白。但用指针,你可以循环它。随着组成(不是指针)它不能循环。

0

如果类是紧耦合的,那么你就可以

  • 做声明的类没有方法的实现,可能使用前向声明,然后实现方法(可能在一个实现文件中)。

否则,您可以

  • 分解出更多的抽象接口(S)足以类在不知道对方的全部细节工作。

但很可能你有一个设计级别的错误,如果是这样,只是解决这个问题。

0

你可以做的是向前声明A类在C类的头文件,那么你在.cpp文件中,你包括A类

页眉有关如何转发声明引用A级,看看这个参考 - Forward declarations in C++

0

最有可能的,我刚刚得到了设计级别的错误。然而,如果你必须这样做,例如,试着通过声明一个空的类A,B而不用在C的头文件中提供任何细节实现来利用前向声明。那么当你需要使用它们时,在C的实现文件中包含A和B的头文件。

记住,U只能在C类的声明

0

在你的头文件使用未来建设:

#ifndef MYCLASS_HPP__20120410__0747 
#define MYCLASS_HPP__20120410__0747 
// Your definions of class, struct, etc... 
#endif// 

和所有包含文件(除自Myclass.hpp)应该在类的头文件Myclass.hpp。他必须包含在Myclass.cpp文件中。