什么是前向声明

What is a forward declaration

我不明白带箭头的那条线到底是干什么的。 class 中是否包括 class?

#ifndef LINEEDIT_H
#define LINEEDIT_H

#include <QLineEdit>

class QToolButton; <--------------------------------------

class EnchancedLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    EnchancedLineEdit(QWidget *parent = 0);
    ~EnchancedLineEdit();

protected:
  void resizeEvent(QResizeEvent *);

private:
    QToolButton *clearBtn;

private slots:
    void updateCloseButton(const QString &text);
};

#endif // LINEEDIT_H

这一行

class QToolButton;

在当前(似乎是全局的)命名空间中声明 class QToolButton,但没有定义 class 本身。即这个声明在作用域中引入了类型class QToolButton。这个class用于classEnchancedLineEdit

的定义
private:
    QToolButton *clearBtn;

其实有线就够了

private:
    class QToolButton *clearBtn;
    ^^^^^

因为它还在当前命名空间中声明了classQToolButton

这些规格

class QToolButton;

class QToolButton

可能在此声明中使用的 class QToolButton *clearBtn; 称为详细类型名称。

在您显示数据成员声明的代码片段中

QToolButton *clearBtn;

不要求 QToolButton 类型是完整的,直到您访问 class QToolButton.

的成员

那是classQToolButton前向声明(如果你google前向声明c++ 你会发现很多关于这个主题的好的搜索结果)

这允许将 class QToolButton 用于指针和引用,只要 QToolButton 的成员未在该特定头文件中访问。

前向声明的目的是加快编译速度。如果不使用前向声明,则需要包含 QToolButton 的头文件。 这意味着,每个包含 EnhancedLineEdit 的头文件的源文件也间接包含 QToolButton 的头文件,即使 class 没有在源文件本身中使用,这会减慢编译过程。

所以只有 EnhancedLineEdit 的源文件需要包含 <QToolButton>。包含 EnhancedLineEdit 头文件的源文件不需要这样做,除非他们想直接使用 class QToolButton 本身。否则前向声明足以允许在 EnhancedLineEdit.

的头文件中使用指向 QToolButton 的指针