C++中,头文件定义的类,在另一个头文件中不需要包含就可以使用?

snail_Wyp 2016-03-21 08:32:10
先给两个头文件:
"Cheery.h" 中定义一个类
#pragma once
#include <iostream>
class Cherry
{
public:
Cherry() {}
virtual void printType()
{
std::cout << "I am a Cherry" << std::endl;
}
};
"CherryTree.h"中引用了上面的类
#pragma once
class CherryTree
{
public:
CherryTree() {}
virtual Cherry* pick()
{
return new Cherry();
}
};

但"CherryTree.h"在并没有#include“Cherry.h” ,却可以编译运行成功。为什么它知道Cherry是个类呢???
...全文
2094 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-03-21
  • 打赏
  • 举报
回复 1
如果你在cpp文件中先包含"Cheery.h" ,再包含"CherryTree.h",那么是可以的,因为头文件编译时只是展开到源文件 但一般你在头文件中用到其他头文件的类时,你就应该包含其,因为你并不能保证CPP文件中的包含情况
ztenv 版主 2016-03-21
  • 打赏
  • 举报
回复
好多大牛们,学习了
lm_whales 2016-03-21
  • 打赏
  • 举报
回复
这样有个顺序依赖问题 当头文件 #include 了另一个头文件,则顺序依赖已经处理掉了,否则必须依序 #include 因为头文件不是编译单元 他在编译的时候,被插入.c或者.cpp 等单元参预编译。(当用 #include 指令包含以后) 编译的时候,只要保证依赖的符号,已经声明, 依赖的类型,常量通常已经定义, 依赖的inline函数,模板已经定义, 就可以保证头文件在编译的时候,不出错。
小灸舞 2016-03-21
  • 打赏
  • 举报
回复
虽然都是 C++的源代码,但头文件不被编译。头文件是放置函数声明的,不会被编译为二进制文件。
只有当被.cpp文件include后,头文件才会被添加到源文件当中一起进行编译。

注:如果LZ在任何一个.cpp文件中#include"CherryTree.h",那么一定过不了编译
iyomumx 2016-03-21
  • 打赏
  • 举报
回复
通常头文件不会单独构成一个编译单元,如果你的一个cpp文件同时包含了这两个头文件,那么它们必须按照顺序先后包含,否则将会出错
snail_Wyp 2016-03-21
  • 打赏
  • 举报
回复
谢谢各位,立刻明白了!!

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧