文件相互包含的错误问题

  • 序言
  • 可能会有的疑问
  • 原因分析
    • C2504: 未定义的基类
    • C2143: 语法错误: 缺少“;”(在“*”的前面)
    • C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    • C2238: 意外的标记位于“;”之前
  • 解决方案

序言

文件相互包含的错误问题实际是两个类相互包含,从而引起的声明先后问题

可能会有的疑问

1、头文件里明明有Header Guards(防卫式声明):

#ifdef
#define
#endif

怎么还会产生所谓的文件相互包含的问题呢?

溪渣渣:Header Guards(防卫式声明)确实有效防止头文件重复包含,但也引出了本章实际错误:两个类相互包含

原因分析

C2504: 未定义的基类

其实这个原因是因为编译基类的h文件中,包含了派生类的h文件,导致派生类在基类之前就已经声明,但是虽然提前声明,可基类依然还是没有声明。

光看文字是很苍白无力的,我举个例子

//AA.h
#ifndef AA_H
#define AA_H#include "BB.h"class AA
{...
两种情况:
1、直接用到BB类
2、CC类里用到BB类,间接联系起来,等同于直接用到BB类
...
};
#endif
//BB.h
#ifndef BB_H
#define BB_H#include "AA.h"class BB :public AA
{...
};
#endif

说到这,就不得不说#include “”/<>的本质了,这实质是把对应的h文件内容copy过来放到该头文件里面,所以实际是这样的:

在编译AA.h时,其实际头文件是:

//AA.h
#ifndef AA_H
#define AA_H//BB.h
#ifndef BB_H
#define BB_H#ifndef AA_H        //已有宏定义,所以再次包含的不编译
...
#endifclass BB :public AA           //BB要编译,就需要AA类,但AA类在后面,等同于AA类并没有任何声明,故报错 C2504: 未定义的基类
{...
};
#endifclass AA
{...
两种情况:
1、直接用到BB类
2、CC类里用到BB类,间接联系起来,等同于直接用到BB类
...
};
#endif

.

C2143: 语法错误: 缺少“;”(在“*”的前面)

C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

C2238: 意外的标记位于“;”之前

该原因是因为AA包含的BB类,没有在AA之前声明,所以"BB"等同于不存在的符号,因此报错。

在编译BB.h时,其实际头文件是:

//BB.h
#ifndef BB_H
#define BB_H//AA.h
#ifndef AA_H
#define AA_H#ifndef BB_H        //已有宏定义,所以再次包含的不编译
...
#endif//AA要想成功声明,首先就需要包含有的BB类的声明了,毕竟BB不存在的话,AA就无法成功声明,所以等同于
class AA                //BB只是个乱写的符号,所以编译器无法识别,所以会报上面的错误
{...
两种情况:
1、直接用到BB类
2、CC类里用到BB类,间接联系起来,等同于直接用到BB类
...
};
#endifclass BB :public AA
{...
};
#endif

解决方案

以上面为例

//AA.h
#ifndef AA_H
#define AA_Hclass BB;class AA
{...
两种情况:
1、直接用到BB类
2、CC类里用到BB类,间接联系起来,等同于直接用到BB类
...
};
#endif
//AA.cpp
#include "AA.h"
#include "BB.h"...
#endif

BB.h不用改,因为AA.h已经可以成功声明了,BB.h可以正常声明了。

为什么在前面放个class,然后在cpp里面放#include ""就行了呢?

简单来说,就是头文件的只需要个声明,用到类的结构如cpp里才需要#include “”,这就好像下文提前声明一样的道理。

int func();void fun()
{cout << func();
}int func()
{return 5;
}

在其代入其实是每个cpp文件编译的情况时,你就明白了

值得注意的是,在AA.h里直接BB b或者调用b->func()等操作是不对的,这样头文件里就不是个声明了,是用到类的结构,就算前置了声明也无效,因为实际的定义在后面还没有实际定义好,只需要改为指针BB *暂时替代,在AA.cpp再行#include "BB.h"进行相关对BB的操作即可。

C++ 头文件的相互包含问题C2504未定义基类 | C2143,C4430,C2238相关推荐

  1. VS error c2504未定义基类

    问题描述 error c2504未定义基类,编译错误,和#include头文件有关. 感谢 http://blog.csdn.net/qncj666/article/details/8562338 详 ...

  2. error:C2504:未定义基类

    这个报错是:类超前的错误,.h文件之间循环包含. 即:在 a.h中包含了b.h,同时在b.h中包含了a.h

  3. MFC 错误 error C2504: “CDialogEx”: 未定义基类,以及错误error C1189

    MFC 错误 error C2504.error C1189 error C2504: "CDialogEx": 未定义基类-报错解决 报错原因 问题解决方法: ## 错误 err ...

  4. error C2504: “CDialogEx”: 未定义基类-报错解决

    当MFC写下如下代码 Dlg d; //Dlg为可视化界面的类 Dlg.DoModal(); 就会出现 Dlg class类没有DoModal error C2504: "CDialogEx ...

  5. error C2504: “XXXXXXX”: 未定义基类

    今天犯到了一个低级错误,记下来加深印象. 造成这一现象主要的原因是头文件相互包含,文件构成一个环形结构,从而编译时循环包含出错 如: AA.h中包含BB.h BB.h中包含CC.h CC.h中包含AA ...

  6. VS2022写Qt代码遇到的问题之 C2504 “xxx”: 未定义基类 (编译源文件

    今天写代码的时候遇到一个这个问题,一直报错,说未定义基类,实际上是定义了的,但是就是报错.我分析问题的思路记录一下.这个问题 这个是微软给的提示.我明明定义了但是就是没找到. 后来我分析应该是编译器在 ...

  7. error:C2504 :“xxxxxxx“未定义基类

    自己遇到该问题的经过: 1.QT项目中已有一个类CModuleFile,类B继承类CModuleFile.(此时可以正常编译). 2.重命名类CModuleFile为类CModuleFileDeal. ...

  8. c++ error:C2504 提示未定义基类

    [背景] 说明:如何打开1处, 注释掉3,则会提示4的错误.如果注释掉1,打开3,则正确.总之,在定义函数中将基类的头文件放在 子类前,很简单,但一不小心很容易出错误.

  9. c2054未定义基类_c++ - 错误C2504:基类未定义 - 堆栈内存溢出

    我之前多次遇到过这个错误并最终找到了解决方案,但是这个让我难过. 我有一个由'Player'继承的类'Mob'. 这是Mob.h: #pragma once #include "PlaySt ...

最新文章

  1. powerbi 线性回归_Power BI二月新增图表及课程福利
  2. OpenCASCADE:适用于 iOS 的 OCCT 示例
  3. Linux 2.6中基于Sysenter的系统调用机制
  4. 自定义tooltip
  5. 运算放大器权威指南_运算放大器科普文章
  6. 基于kubectl实现红队K8S模拟对抗
  7. kubernetesv1.17集群生态搭建笔记
  8. 《此生未完成读书总结》
  9. 抛弃Visio,遇上效率作图工具Edraw亿图图示
  10. [渝粤教育] 西南科技大学 统计学原理 在线考试复习资料(3)
  11. Isight软件调用matlab
  12. 使用GPU加速图片处理的多种方案解析
  13. 第二章第一节 能把梳子卖给和尚吗
  14. (附源码)springboot石河子海关门户网站 毕业设计 241103
  15. 安装 SIMATIC STEP7 Professional 一直停留在修改系统 估计剩余时间:2分钟
  16. 批处理写的系统文件替换
  17. 计算机毕业设计asp.net在线订餐外卖网站设计(源码+系统+mysql数据库+Lw文档)
  18. linux下安装python3报错_linux安装python3
  19. win10系统,必须要设置登陆密码的解决方法
  20. C语言模块化编程样例

热门文章

  1. 热点:企业滥用个人信息该到头了,GDPR最高罚单出炉
  2. 软件设计模式之路-----工厂模式抽象工厂模式
  3. cadence绘制schematic时连线方式改变
  4. 微博粉丝走势监控-数据处理
  5. [网络应用]十一期间论坛开放注册活动汇总
  6. 【阿里云ACE 北京】[AA 羽毛球休闲] 3月11日 大兴体育局羽毛球馆
  7. 牙齿稀松可以做牙齿修复吗?
  8. 2023字节、腾讯、阿里等6家大厂Java开发面试真题+高频面试题总结
  9. 小学生学计算机步骤,谈小学生电脑绘画教学策略
  10. SFT_SOFTGRIDSERVER变量