自动需要的课程?

时间:2010-06-06 20:56:27

标签: c++ class include guard

假设我有一个A类和一个B类。

A的.h需要B的.h,B的.h需要A的.h。(需要= #include)。

所有.h都有警卫:

#ifndef _classX_
#define _classX_
...
...
#endif

但是如果我编译A的.cpp,那么当它包含B的.h时,B类不能包含A类的.h,因为A类已经使用了守卫。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

您需要其中一个类的前向声明。

// a.h
// do not #include b.h

class B;    // forward declaration

class A {
    ....
    B * b;
};

请注意,A类不能包含实际的B实例 - 它必须是指针或引用。你也不能通过标题中的B指针调用任何函数 - 它们必须进入.cpp源文件,其中#includes两个标题。

答案 1 :(得分:3)

他们中的一个需要绕开而不包括它。对于许多情况,这是可能的,您可以将#include移动到.cpp文件

class A {
  // no need for header of B here
  void f(B b);

  // no need for header of B here either
  B *b;
};

通常,对于定义在.cpp文件中的函数声明,标题中不需要任何#includes。对于类成员,如果要将它们作为嵌入的值对象使用,则只需要标题。在这种情况下,你需要在.cpp文件中将它们更改为指针(或智能指针)和new。为了让编译器知道上面例子中B是什么,你只需要在A的定义之前放一个前向声明:

class B;