解决C++中 3 个类的循环包含

Resolve circular include of 3 classes in C++

本文关键字:循环 包含 C++ 解决      更新时间:2023-10-16

我有 3 个类,我将它们称为 A、B 和 C(此示例中的名称是任意的(。 所有这 3 个类都包含一个头文件和一个 cpp 文件。

我有以下依赖项:

A
  • 需要知道 B,因为 A 具有类型 B 的成员
  • B
  • 需要知道 A 和 C,因为 B 具有两种类型的成员
  • C
  • 需要知道 A,因为 C 具有类型 A 的成员

我已经尝试了几个选项(在这里包括这个标题,在那里包括类的前向声明(,但编译从来没有成功。我也无法从仅解决 2 个类之间循环包含问题的问题的答案中提取任何有用的信息。

编辑: 这是我当前设置的最小(希望足够(示例:
A.h

class A {
private:
B myB;
};

B.h

class B {
private:
A* myA;
C myC;
};

C.H

class C {
private:
A* myA;
}

我也许还应该注意到,B::myA 和 C::myA 总是指向同一个 A 实例。

由于类C只包含一个指向类A指针,它不需要AB的完整定义(它不使用(; 因此,只需声明A为类的语句就足够了:

C.H

class A; // Declare that A is a class - then we can have a pointer to it...
class C {
private:
A* myA;
}

B需要C的定义,因为它包含C实例;并且,像类C一样,简单地将A声明为类(如C.h中已经做的那样(就可以:

B.h

#include "C.h" // Note: This header already declares "A" as a class!
class B {
private:
A* myA;
C myC;
};

A需要定义B,因为它包含B实例。但请注意,B.h已经包括C.h

#include "B.h"
class A {
private:
B myB;
};

请注意,任何其他使用ABC中的一个或多个的文件只需要包含A.h标头,因为这本身将包括其他文件。