关于c ++:正确包含基类和子类(派生类)的头文件?

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

假设我有两个基类,base1和base2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 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

我在每个头文件中包含彼此的头文件,因为base1有base2作为参数的函数,base2有base1作为参数的函数。

那么假设我有5个子类(派生类)用于base1和base2;

base1_sub1,base1_sub2,base1_sub3,base1_sub4,base1_sub5用于base1base2_sub1,base2_sub2,base2_sub3,base2_sub4,base2_sub5用于base2。

我希望能够有5个base1派生类作为中类函数的参数,比如base2_sub1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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的子类(如base2_sub1)以同样的方式将base1的子类作为函数参数。

我发现正确地包含这些头是非常令人困惑的,我不知道怎么做。请帮帮我。


如果通过引入forward声明可以避免包含头,则不需要包含头。您的Base1.hBase2.h头都提供了很好的例子:Base1只使用Base2的正向声明编译,因为它只使用指向Base2的指针;Base2使用Base1指针也是如此。因此,可以安全地去除相互夹杂。

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.

就包含头文件的头文件而言,如果可以使用指向Base1Base2的指针定义子类的头文件,则根本不包括头文件。这将缩短编译代码所需的时间。

当然,您需要为实例化的类和调用成员函数或访问其数据成员的类包含头。