在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 *类型,这样就不重复包含头文件了,这个前置声明也是一个解决办法,比个人那个更好,这个地方要注意引用