正确包含 base-classes 和 sub-classes 的 header 文件(派生 类)?

Including header files of base-classes and sub-classes (derived classes) correctly?

假设我有 2 个基 classes,Base1 和 Base2。

// Base1.h
#ifndef BASE1_H
#define BASE1_H
#include "Base2.h"

class Base2;

class Base1 {
    ...
    void func(Base2* b);
    virtual void subfunc(Base2* b) = 0;
    ...
};
#endif



// Base2.h
#ifndef BASE2_H
#define BASE2_H
#include "Base1.h"

class Base1;

class Base2 {
    ...
    void func(Base1 *b);
    virtual void subfunc(Base1* b) = 0;
    ...
};
#endif

我在每个 header 文件中包含彼此的 header 文件,因为 Base1 具有 Base2[=49= 的功能] 作为参数,Base2 具有以 Base1 作为参数的函数。

然后假设我有 5 个 subclasses(派生的 classes)用于 Base1Base2;

Base1_Sub1、Base1_Sub2、Base1_Sub3、Base1_Sub4、Base1_Sub5 for Base1
Base2_Sub1、Base2_Sub2、Base2_Sub3、Base2_Sub4、Base2_Sub5 for Base2.

我希望能够将 Base1 的 5 个派生 classes 作为 class 函数的参数,比方说 Base2_Sub1.

// Base2_Sub1.h
#ifndef BASE2_SUB1_H
#define BASE2_SUB1_H
#include "Base2.h"
// What else to include!?

class Base2_Sub1 : public Base2 {
    ...
    void subfunc(Base1_Sub1 *b);
    void subfunc(Base1_Sub2 *b);
    void subfunc(Base1_Sub3 *b);
    void subfunc(Base1_Sub4 *b);
    void subfunc(Base1_Sub5 *b);
    ...
};
#endif

Base1_Sub1.h到Base1_Sub5.h应该包含在什么文件中?
我还需要Base2的subclasses(比如Base2_Sub1)才能有subclasses Base1 作为函数参数以同样的方式。

我发现正确地包含这些 header 非常令人困惑,我不知道如何。请帮助我。

如果可以通过引入前向声明来避免包含 header,则不需要包含 header。您的 Base1.hBase2.h header 都提供了很好的示例:Base1 可以仅使用 Base2 的前向声明进行编译,因为它仅使用指向 Base2; Base2Base1 指针的使用也是如此。因此,可以安全地去除相互包含。

In what file should Base1_Sub1.h to Base1_Sub5.h be included?

在相应的 Base1_Sub1.cppBase1_Sub5.cpp 中必须包含在内。其他 cpp 文件应根据需要包含它们。

I also need subclasses of Base2 (such as Base2_Sub1) to have subclasses of Base1 as function parameter the same way.

就包括 header 文件在内的 header 文件而言,如果可以使用指向 Base1 的指针定义子 类 的 header 和Base2,根本不包括 header。这将缩短编译代码所需的时间。

当然你需要为你实例化的类和你调用成员函数或访问其数据成员的类包含[=36​​=]。