【问题标题】:Resolve circular include of 3 classes in C++解决 C++ 中 3 个类的循环包含问题
【发布时间】:2019-12-02 03:00:15
【问题描述】:

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

我有以下依赖项:

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

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

编辑: 这是我当前设置的最小(希望足够)示例:
啊。

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 实例。

【问题讨论】:

  • I have tried out several options already (include this header here, forward-declaration of class there), but compilation was never succesful. 前向声明是要走的路,我们需要一个minimal reproducible example
  • 向我们展示您的类的(可能是缩写的)声明和定义,我 100% 确信这里有人会为您提供解决问题的方法(或者可能不止一个解决方案)。跨度>
  • 我们真的需要看一个清楚的例子来说明你正在尝试做什么,尤其是关于哪些成员是指针/引用与整个对象。目前,我可以阅读您的解释,即希望每个 A 包含一个 B,然后每个 B 包含一个 A,这将导致无穷大,这是行不通的。
  • @TheUndeadFish 请求的示例已添加。

标签: c++ dependencies include header-files


【解决方案1】:

由于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

啊.h

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

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

【讨论】:

  • 非常感谢,在将您的解决方案应用于我的项目并在 C.cpp 中另外包含 A.h 之后,它的编译没有问题。
猜你喜欢
  • 2021-07-28
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多