0

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

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

所有 .h 都有警卫:

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

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

我该如何解决这个问题?

4

2 回答 2

5

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

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

class B;    // forward declaration

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

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

于 2010-06-06T21:00:37.193 回答
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 文件中的函数声明,您不需要在标头中添加任何 #include。对于类成员,如果您想将它们作为值对象嵌入,则只需要标题。在这种情况下,您需要将它们更改为指针(或智能指针)和new.cpp 文件中的它们。为了让编译器知道B我上面的例子中的内容,你只需要在定义之前放置一个前向声明,A如下所示:

class B;
于 2010-06-06T21:02:23.220 回答