首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确地包括基类和子类(派生类)的头文件吗?

正确地包括基类和子类(派生类)的头文件吗?
EN

Stack Overflow用户
提问于 2015-07-28 00:33:45
回答 1查看 3.3K关注 0票数 1

假设我有两个基类,Base1和Base2。

代码语言:javascript
复制
// 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为参数的函数。

然后假设我有Base1Base2的5个子类(派生类);

Base1_Sub1,Base1_Sub2,Base1_Sub3,Base1_Sub4,Base1_Sub5 for Base1

Base2_Sub1,Base2_Sub2,Base2_Sub3,Base2_Sub4,Base2_Sub5 Base2.

我希望能够有5个派生类Base1作为类函数的参数,比如Base2_Sub1

代码语言:javascript
复制
// 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 to Base1_Sub5.h应该包含在哪个文件中?

我还需要Base2的子类(如Base2_Sub1)以相同的方式将Base1的子类作为函数参数。

我发现正确地包含这些标题是非常令人费解的,而且我也不知道怎么做。请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-28 00:59:53

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

Base1_Sub1.h to Base1_Sub5.h应该包含在哪个文件中?

在他们相应的Base1_Sub1.cppBase1_Sub5.cpp中,包含这一内容是强制性的。其他cpp文件应在必要时包括它们。

我还需要Base2的子类(如Base2_Sub1)以相同的方式将Base1的子类作为函数参数。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31665600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档