C++源文件中互相引用对方的头文件没问题的

Posted 老虎中的小白Gentle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++源文件中互相引用对方的头文件没问题的相关的知识,希望对你有一定的参考价值。

小白来了个疑问:有没有A.cpp include B.h B.cpp include A.h的 ?这样做可行吗?
大佬:可以,我给你举个栗子

大佬:你的意思是cpp文件互相用到了对方h文件里的内容 吗?
是的

//a.h
class B;
class A
{
	A(B* pb);
	B* pb_;
};

///a.cpp
#include "b.h"
#include "a.h"
A::A(B* pb) :pb_(pb)
{

}

///b.h
class A;
class B
{
	B(A* pa);
	A *pa_;
};


//b.cpp
#include "a.h"
#include "b.h"
B::B(A *pa) :pa_(pa)
{

}

小白:晕(微信表情包)
大佬:c++的文件包含会是个大坑 得慢慢摸索才能找到规律
如果用到 B的指针 那么 class B; 这样申明一下即可
如果用到 B的实例或者成员方法 那么要 #include “b.h”

小白:那不包含b.h, 声明个B也没用吧

大佬:有用
表明B是个类 因为编译器要确定指针类型
假如 B类有个成员函数 f1();
如果a.cc文件里用到pb_->f1(); 这种就属于访问成员方法 必须#include “b.h”
而a.h里面不用#include “b.h” 是因为 a.h里仅仅出现了一个 B*

小白:对了
class B
{
};
B b;
不应该B b这样声明的吗

大佬:
class B
{
};
这是类的申明与定义
B b;
这是类的实例化

小白:class B;这是什么?
大佬:申明 B是个类,也是类的申明。类可以在多个地方申明多次,但只能定义一次。申明与定义这两个概念是不一样的。

小白:
class B;
class A
{
A(B* pb); //构造?
B* pb_; //成员?
};

大佬:对,开发中遇到具体的问题的时候再研究这个理解会更深刻
小白:get,暂时没有疑问了

以上是关于C++源文件中互相引用对方的头文件没问题的的主要内容,如果未能解决你的问题,请参考以下文章

关于include头文件的问题

将 C++ 嵌套类分离到它们自己的头文件中

c++关于multiset的头文件包含问题。

C++ 中的头文件和命名空间

C++,大佬们看下这里报错是为啥?可是这代码能AC啊?!

通过 <...> 访问大型 C++ 项目中的头文件