C ++包含头文件

时间:2012-04-10 03:09:53

标签: c++ header declaration

所以,我遇到了一个问题:

A类需要了解B类,B类需要了解C,而C类需要了解A. 它本质上是一个圆圈,所以我得到了定义错误。我试着向前宣布,但无论如何,都不知道底部还有什么。

我怎么会这样的情况?

由于

大卫

5 个答案:

答案 0 :(得分:2)

假设这很简单,Adam Mihalcin上面的评论是正确的,因为类似的问题可以回答它。但无论如何我都会编码。

假设你有这个(方法定义无关紧要):

class A
{
    B* ptrB;
}

class B
{
    C* ptrC;
}

class C
{
    A* ptrA;
}

然后你可以像亚当一样,直接向他们展示三个人:

class A;
class B;
class C;

将该区块放在其中3个区块之上。这里重要的是,这是当其他类有指针时,而不是它们是类的一部分的组合。您可以使用forward-declaration来处理指针时正确编译,但不能与其他数据类型一起编译。所以如果有的话:

class D
{
    B myB;
}

如果其他一切与上面相同,那么你需要在D的“真实”定义之上具有B的“真实”定义。但其余的可能是相同的。前向声明仅适用于指针。

你必须用指针打破你的依赖循环。如果从来没有指针,那么数据结构是“无限的”,因此不起作用。那是因为在我的例子中,D 总是包含一个B.但是如果一个A总是包含一个B,而一个B总是包含一个C,那么一个C总是包含一个A?好吧,最后的A需要另一个B,这需要另一个C,...我希望你能得到这个想法。但是使用指针,你可以循环它。使用合成(而不是指针)它无法循环。

答案 1 :(得分:0)

如果类紧密耦合,则可以使用

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

否则,您可以

  • 在不知道彼此完整详细信息的情况下,将更抽象的接口分解为足以使类工作。

但很可能你有一个设计级别的错误,如果有的话,只需修复它。

答案 2 :(得分:0)

你可以做的是在C类的头文件中转发声明类A,然后你在.cpp文件中包含A类的标题。

有关如何转发声明A类的参考,请参阅此参考 - Forward declarations in C++

答案 3 :(得分:0)

很可能,你刚刚遇到设计级错误。

但是,如果必须这样做,例如,只需尝试通过声明空类A,B来利用前向声明,而不在C的头文件中显示任何详细实现。然后在需要使用它们时在C的实现文件中包含A和B的标题。

请记住,你只能在C类声明中使用指针。

答案 4 :(得分:0)

在头文件中使用下一个构造:

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

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