可以说我有2个基类,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

因为 Base1 具有将 Base2 作为参数的函数,并且 Base2 具有将 Base1 作为参数的函数,所以我将彼此的头文件包含在每个头文件中。

然后,假设 Base1 Base2 都有5个子类(派生类);

的Base1_Sub1,Base1_Sub2,Base1_Sub3,Base1_Sub4,Base1_Sub5 Base1
Base2_Sub1,Base2_Sub2,Base2_Sub3,Base2_Sub4,Base2_Sub5用于 Base2

我希望能够将 Base1 的5个派生类作为类函数的参数,比如说 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 的子类(例如Base2_Sub1),以相同的方式将 Base1 的子类作为函数参数。

我发现正确地包含这些 header 非常混乱,我也不知道如何。请帮我。

最佳答案

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



在与Base1_Sub1.cpp相对应的Base1_Sub5.cpp中,必须包含此内容。其他cpp文件应根据需要包括它们。



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

当然,您需要为实例化的类以及调用成员函数或访问其数据成员的类包括 header 。

09-27 21:25