C++前置声明的一个好处与用法

在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>等,而是使用前置声明,可以使编译过程更快一些

解释的已经很清楚了,我回忆了一下我以前写过的代码,确实出现过这样的情况,

在A.h中这样写的

#include "B.h"
class A
{
	//.........其他什么
private:
	class * B;
};

B.h中这样写

#include "A.h"
class B
{
	//.........其他什么
private:
	class * A;
};

然后再cpp中使用任何一个类都出现问题,导致的递归引用,从这可以推测其他类似的情况.

我曾经的一个实际的情况是子对话框有父窗口的指针,父窗口还有子窗口的指针,就因为包含头文件的问题出现错误,我最后解决的方法是指针全部换成两个窗口类的父类的指针类型CDialog *类型,这样就不重复包含头文件了,这个前置声明也是一个解决办法,比我的那个更好,这个地方要注意

你可能感兴趣的:(C++前置声明的一个好处与用法)