問題:
想必正在基礎階段學習的朋友們都遇見過以下問題吧
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的特征的信號和槽來實現……