C++ 头文件的相互包含问题C2504未定义基类 | C2143,C4430,C2238
文件相互包含的错误问题
- 序言
- 可能会有的疑问
- 原因分析
- 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相关推荐
- VS error c2504未定义基类
问题描述 error c2504未定义基类,编译错误,和#include头文件有关. 感谢 http://blog.csdn.net/qncj666/article/details/8562338 详 ...
- error:C2504:未定义基类
这个报错是:类超前的错误,.h文件之间循环包含. 即:在 a.h中包含了b.h,同时在b.h中包含了a.h
- MFC 错误 error C2504: “CDialogEx”: 未定义基类,以及错误error C1189
MFC 错误 error C2504.error C1189 error C2504: "CDialogEx": 未定义基类-报错解决 报错原因 问题解决方法: ## 错误 err ...
- error C2504: “CDialogEx”: 未定义基类-报错解决
当MFC写下如下代码 Dlg d; //Dlg为可视化界面的类 Dlg.DoModal(); 就会出现 Dlg class类没有DoModal error C2504: "CDialogEx ...
- error C2504: “XXXXXXX”: 未定义基类
今天犯到了一个低级错误,记下来加深印象. 造成这一现象主要的原因是头文件相互包含,文件构成一个环形结构,从而编译时循环包含出错 如: AA.h中包含BB.h BB.h中包含CC.h CC.h中包含AA ...
- VS2022写Qt代码遇到的问题之 C2504 “xxx”: 未定义基类 (编译源文件
今天写代码的时候遇到一个这个问题,一直报错,说未定义基类,实际上是定义了的,但是就是报错.我分析问题的思路记录一下.这个问题 这个是微软给的提示.我明明定义了但是就是没找到. 后来我分析应该是编译器在 ...
- error:C2504 :“xxxxxxx“未定义基类
自己遇到该问题的经过: 1.QT项目中已有一个类CModuleFile,类B继承类CModuleFile.(此时可以正常编译). 2.重命名类CModuleFile为类CModuleFileDeal. ...
- c++ error:C2504 提示未定义基类
[背景] 说明:如何打开1处, 注释掉3,则会提示4的错误.如果注释掉1,打开3,则正确.总之,在定义函数中将基类的头文件放在 子类前,很简单,但一不小心很容易出错误.
- c2054未定义基类_c++ - 错误C2504:基类未定义 - 堆栈内存溢出
我之前多次遇到过这个错误并最终找到了解决方案,但是这个让我难过. 我有一个由'Player'继承的类'Mob'. 这是Mob.h: #pragma once #include "PlaySt ...
最新文章
- powerbi 线性回归_Power BI二月新增图表及课程福利
- OpenCASCADE:适用于 iOS 的 OCCT 示例
- Linux 2.6中基于Sysenter的系统调用机制
- 自定义tooltip
- 运算放大器权威指南_运算放大器科普文章
- 基于kubectl实现红队K8S模拟对抗
- kubernetesv1.17集群生态搭建笔记
- 《此生未完成读书总结》
- 抛弃Visio,遇上效率作图工具Edraw亿图图示
- [渝粤教育] 西南科技大学 统计学原理 在线考试复习资料(3)
- Isight软件调用matlab
- 使用GPU加速图片处理的多种方案解析
- 第二章第一节 能把梳子卖给和尚吗
- (附源码)springboot石河子海关门户网站 毕业设计 241103
- 安装 SIMATIC STEP7 Professional 一直停留在修改系统 估计剩余时间:2分钟
- 批处理写的系统文件替换
- 计算机毕业设计asp.net在线订餐外卖网站设计(源码+系统+mysql数据库+Lw文档)
- linux下安装python3报错_linux安装python3
- win10系统,必须要设置登陆密码的解决方法
- C语言模块化编程样例