包括C++;头文件 目前,我正在学习C++ GUI——QT,我对头文件感到困惑。

包括C++;头文件 目前,我正在学习C++ GUI——QT,我对头文件感到困惑。,c++,qt,C++,Qt,例如,我想在构造函数中使用QHBoxLayout来管理布局。 QHBoxLayout和QVBoxLayout继承自QBoxLayout。因此,QBoxLayout头文件不应包含关于QHBoxLayout或QVBoxLayout的定义。但它工作正常 P>这可能是QT的一个特性,或者它对原生C++语言有作用吗? #include "dialog.h" #include <QBoxLayout> Dialog::Dialog(int tempCelsius, QWidget *pare

例如,我想在构造函数中使用
QHBoxLayout
来管理布局。
QHBoxLayout
QVBoxLayout
继承自
QBoxLayout
。因此,QBoxLayout头文件不应包含关于
QHBoxLayout
QVBoxLayout
的定义。但它工作正常

<> P>这可能是QT的一个特性,或者它对原生C++语言有作用吗?
#include "dialog.h"
#include <QBoxLayout>

Dialog::Dialog(int tempCelsius, QWidget *parent)
    : QDialog(parent)
{   
    QHBoxLayout *mainLayout = new QHBoxLayout();
    QVBoxLayout *leftLayout = new QVBoxLayout();
    QVBoxLayout *rightLayout = new QVBoxLayout();
    celsiusGroupBox = new QGroupBox(this);
    fahrenheitGroupBox = new QGroupBox(this);
    celsiusDia = new QDial(celsiusGroupBox);
    fahrenheitDia = new QDial(fahrenheitGroupBox);
    celsiusLDNumber = new QLCDNumber(celsiusGroupBox);
    fahrenheitLDNumber = new QLCDNumber(fahrenheitGroupBox);
    celsiusGroupBox->setTitle("Celsius");
    fahrenheitGroupBox->setTitle("Fahrenheit");
    leftLayout->addWidget(celsiusDia);
    leftLayout->addWidget(celsiusLDNumber);
    celsiusGroupBox->setLayout(leftLayout);
    rightLayout->addWidget(fahrenheitDia);
    rightLayout->addWidget(fahrenheitLDNumber);
    fahrenheitGroupBox->setLayout(rightLayout);
    celsiusGroupBox->setLayout(leftLayout);
    mainLayout->addWidget(celsiusGroupBox);
    mainLayout->addWidget(fahrenheitGroupBox);
    setLayout(mainLayout);
}

#包括“dialog.h”
#包括
Dialog::Dialog(int-tempcellius,QWidget*父项)
:QDialog(父级)
{   
QHBoxLayout*mainLayout=新的QHBoxLayout();
QVBoxLayout*leftLayout=新的QVBoxLayout();
QVBoxLayout*rightLayout=新的QVBoxLayout();
celsiusGroupBox=新的QGroupBox(本);
fahrenheitGroupBox=新的QGroupBox(此);
Celsiusia=新QDial(celsiusGroupBox);
华氏温度=新的QDial(华氏温度分组框);
celsiusLDNumber=新的QLCDNumber(celsiusGroupBox);
fahrenheitLDNumber=新的QLCDN编号(fahrenheitGroupBox);
celsiusGroupBox->setTitle(“摄氏度”);
华氏组框->设置标题(“华氏”);
leftLayout->addWidget(celsiusDia);
leftLayout->addWidget(celsiusLDNumber);
celsiusGroupBox->setLayout(左布局);
rightLayout->addWidget(华氏度);
rightLayout->addWidget(华氏数);
华氏组框->设置布局(右布局);
celsiusGroupBox->setLayout(左布局);
mainLayout->addWidget(celsiusGroupBox);
mainLayout->addWidget(华氏组框);
设置布局(主布局);
}

实际上,
QBoxLayout
中定义了所有三个类。Qt这样做是为了减少包含的数量。在C++中,对于非常小的类,通常只使用它们的父类。
QHBoxLayout
QVBoxLayout
在其构造函数/析构函数中都只是“特殊的”。您可以打开头文件的实现并进行查看。(请注意,
只包含

首先,头文件不包含类的定义。它们只包含类的声明,这些声明稍后在相应的.cpp文件中定义。当您从scrat构建库时,这些声明被编译成静态和动态库,可能是lQt5Widgetsch或下载预编译的二进制文件。然后将其链接到您的程序,以便解析所有名称。因此,这实际上并不是因为定义位于
中,而是因为
包含
QHBoxLayout
QVBoxLayout
的声明。 下面从
中提取的代码显示了它们的声明


113类Q_WIDGETS_导出QHBoxLayout:公共QBoxLayout
114 {
115 Q_对象
116公众:
117 QHBoxLayout();
118明确的QHBoxLayout(QWidget*父项);
119~QHBoxLayout();
120
121
122私人:
123 Q_禁用_复制(QHBoxLayout)
124 };
125
126类Q_WIDGETS_导出QVBoxLayout:公共QBoxLayout
127 {
128 Q_对象
129公众:
130 QVBoxLayout();
131显式QVBoxLayout(QWidget*父项);
132~QVBoxLayout();
133
134
135私人:

它之所以能工作,是因为它们是在
中声明的,并且您可能正在将它链接到正确的库中,在那里也可以找到它们的定义。

请注意,由于C++预处理器的工作方式,您可能会意外地通过包含所需文件的其他头文件“拉入”类型。因此,仅仅因为“它工作正常”并不总是意味着它是正确的。我不认为这是重复的,但您可能会发现讨论很有帮助:
#include
#include
与添加几乎所有类的
#include
类似吗?类是在头文件中定义的。类的函数通常在头文件中声明,在头文件中定义源代码。但类本身已定义。请参见标准的
[class]/1,2
[class.name]/1