在 C++ 中解决 3 类 的循环包含
Resolve circular include of 3 classes in C++
我有 3 个 class,我将它们称为 A、B 和 C(本例中的名称是任意的)。
所有这 3 个 class 都由一个 header-file 和一个 cpp-file 组成。
我有以下依赖项:
- A 需要知道 B,因为 A 有一个 B 类型的成员
- B 需要知道 A 和 C,因为 B 有两种类型的成员
- C 需要知道 A,因为 C 有一个类型为 A 的成员
我已经尝试了几个选项(包括这里的 header,那里的 class 的 forward-declaration),但编译从未成功。我也无法从仅解决 2 classes.
之间的循环包含问题的问题的答案中提取任何有用的信息
编辑:
这是我当前设置的最小(希望足够)示例:
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-instance。
因为 class C
只包含一个指向 class A
的 指针 ,它不需要完整的 definition 用于 A
或 B
(它不使用);因此,只需声明 声明 A
作为 class 就足够了:
C.h
class A; // Declare that A is a class - then we can have a pointer to it...
class C {
private:
A* myA;
}
Class B
需要 C
的 定义 ,因为它包含一个 实例 C
;并且,像 class C
一样,只需将 A
声明为 class(正如 C.h
中已经完成的那样)就可以:
B.h
#include "C.h" // Note: This header already declares "A" as a class!
class B {
private:
A* myA;
C myC;
};
Class A
需要 B
的 定义 ,因为它包含一个 实例 B
个。但请注意 B.h
已经包含 C.h
:
A.h
#include "B.h"
class A {
private:
B myB;
};
请注意,使用 A
、B
和 C
中的一个或多个的任何其他文件只需要包含 A.h
header,因为这样本身将包括其他人。
我有 3 个 class,我将它们称为 A、B 和 C(本例中的名称是任意的)。 所有这 3 个 class 都由一个 header-file 和一个 cpp-file 组成。
我有以下依赖项:
- A 需要知道 B,因为 A 有一个 B 类型的成员
- B 需要知道 A 和 C,因为 B 有两种类型的成员
- C 需要知道 A,因为 C 有一个类型为 A 的成员
我已经尝试了几个选项(包括这里的 header,那里的 class 的 forward-declaration),但编译从未成功。我也无法从仅解决 2 classes.
之间的循环包含问题的问题的答案中提取任何有用的信息编辑:
这是我当前设置的最小(希望足够)示例:
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-instance。
因为 class C
只包含一个指向 class A
的 指针 ,它不需要完整的 definition 用于 A
或 B
(它不使用);因此,只需声明 声明 A
作为 class 就足够了:
C.h
class A; // Declare that A is a class - then we can have a pointer to it...
class C {
private:
A* myA;
}
Class B
需要 C
的 定义 ,因为它包含一个 实例 C
;并且,像 class C
一样,只需将 A
声明为 class(正如 C.h
中已经完成的那样)就可以:
B.h
#include "C.h" // Note: This header already declares "A" as a class!
class B {
private:
A* myA;
C myC;
};
Class A
需要 B
的 定义 ,因为它包含一个 实例 B
个。但请注意 B.h
已经包含 C.h
:
A.h
#include "B.h"
class A {
private:
B myB;
};
请注意,使用 A
、B
和 C
中的一个或多个的任何其他文件只需要包含 A.h
header,因为这样本身将包括其他人。