两头文件互引问题解决(前置声明)
问题:
想必正在基础阶段学习的朋友们都遇见过以下问题吧
widget.h
otherwidget.h
如上问题是,我在widget.h中引用了otherwidget.h ,在ohterwidget中又引用了widget.h,两个头文件互相引用产生了报错
解决办法:
那么我们该如何解决呢,就用到了前置声明
看这样完美解决了两头文件互引的问题,对 Widget
类进行了前置声明,这意味着代码里知晓 Widget
类的存在,但并未包含其完整定义。
但是注意什么叫做未包含完整定义呢,指的是编译器仅知道某个类或类型的存在,但不了解其具体的实现细节,像类的成员变量、成员函数的具体实现等。
在具体一点,以下代码大家都应该知道吧是显示widget窗口,不过因为otherwidget并未包含其完整定义所以导致,我不知道它来自于什么,我只知道他的类型是Widget *widget
this->widget->show();
升级:
所以我们还需要进入我们的.cpp文件,再去加入#include "widget",就包含了器完整定义
otherwidget.cpp
这时又出现了新问题,嘶~不是会报错吗,怎么又能引用了,所以注意这是widget.cpp文件 ,那我们看下面的解释:
在 otherwidget.h
中,使用了 class Widget;
进行前置声明,这仅仅让编译器知道 Widget
是一个类名,但不清楚该类的具体实现细节。如果在 OtherWidget
类的实现中需要访问 Widget
类的成员变量或者调用其成员函数,就必须包含 Widget
类的完整定义,也就是要包含 widget.h
头文件。
头文件和源文件的分工
头文件(.h
):主要用于声明类、函数、常量等,为其他文件提供接口。头文件通常会使用头文件保护机制(如 #ifndef
、#define
、#endif
)来避免重复包含。
源文件(.cpp
):负责实现头文件中声明的类和函数。在源文件里,会包含必要的头文件,以获取相关的声明信息,进而完成具体的实现。
所以C++是不是很神奇呢,当然我们需要两个窗口互相访问的时候不止可以用这种方法,还可以使用Qt的特征的信号和槽来实现……