在C++ GUI Qt編程中有下面的一個頭文件:編程
#ifndef FINDDIALOG_H #define FINDDIALOG_H #include <QDialog> class QCheckBox;//爲何要進行前置聲明? class QLabel; class QLineEdit; class QPushButton; class FindDialog : public QDialog { //...................其餘什麼的 private: QLabel *label; QLineEdit *lineEdit; QCheckBox *caseCheckBox; QCheckBox *backwardCheckBox; QPushButton *findButton; QPushButton *closeButton; }; #endif
後面書的解釋是這樣的:指針
前置聲明會告訴這個類的存在,而不用提供類定義的全部細節,他們一般放在它本身的頭文件中,下面FindDialog類中使用的都是這幾個類的指針,並且沒有必要再頭文件中使用他們,由於編譯就無需這些類的完整定義,咱們沒有使用這些的頭文件,如<QCheckBox>,<QLabel>等,而是使用前置聲明,能夠使編譯過程更快一些code
解釋的已經很清楚了,我回憶了一下我之前寫過的代碼,確實出現過這樣的狀況,
遞歸
在A.h中這樣寫的it
#include "B.h" class A { //.........其餘什麼 private: class * B; };
B.h中這樣寫編譯
#include "A.h" class B { //.........其餘什麼 private: class * A; };
而後再cpp中使用任何一個類都出現問題,致使的遞歸引用,從這能夠推測其餘相似的狀況.class
我曾經的一個實際的狀況是子對話框有父窗口的指針,父窗口還有子窗口的指針,就由於包含頭文件的問題出現錯誤,我最後解決的方法是指針所有換成兩個窗口類的父類的指針類型CDialog *類型,這樣就不重複包含頭文件了,這個前置聲明也是一個解決辦法,比個人那個更好,這個地方要注意引用