Das PIMPL-Idiom (Pointer to Implementation) ermöglicht die Trennung der öffentlichen Schnittstelle von den privaten Implementierungsdetails von eine Klasse, wodurch verhindert wird, dass sich Benutzer der Klasse mit diesen Details befassen. Qt verwendet eine eigene Implementierung des PIMPL-Idioms, die unten dokumentiert ist.
Die PIMPL-basierte Schnittstelle für Qt sieht wie folgt aus:
<code class="cpp">class CoordinateDialog : public QDialog { Q_OBJECT Q_DECLARE_PRIVATE(CoordinateDialog) #if QT_VERSION <= QT_VERSION_CHECK(5,0,0) Q_PRIVATE_SLOT(d_func(), void onAccepted()) #endif QScopedPointer<CoordinateDialogPrivate> const d_ptr; public: CoordinateDialog(QWidget * parent = 0, Qt::WindowFlags flags = 0); ~CoordinateDialog(); QVector3D coordinates() const; Q_SIGNAL void acceptedCoordinates(const QVector3D &); };</code>
Hier , das Makro Q_DECLARE_PRIVATE deklariert die PIMPL-Klasse und stellt die notwendigen Mechanismen für den Zugriff darauf bereit.
Die PIMPL-Klasse CoordinateDialogPrivate ist in der Implementierungsdatei definiert:
<code class="cpp">class CoordinateDialogPrivate { Q_DISABLE_COPY(CoordinateDialogPrivate) Q_DECLARE_PUBLIC(CoordinateDialog) CoordinateDialog * const q_ptr; QFormLayout layout; QDoubleSpinBox x, y, z; QDialogButtonBox buttons; QVector3D coordinates; void onAccepted(); CoordinateDialogPrivate(CoordinateDialog*); };</code>
Das Makro Q_DECLARE_PRIVATE vereinfacht die Deklaration der PIMPL-Klasse und verknüpft sie mit der Schnittstellenklasse. Es generiert Inline-Implementierungen der d_func()-Hilfsmethode, die den Zugriff auf PIMPL mit entsprechender Konstanz ermöglicht.
Dieses Makro wird für die Qt 4-Kompatibilität oder bei der Ausrichtung auf Nicht-C 11 verwendet Compiler. Es deklariert einen privaten Slot für den internen Gebrauch.
Das Makro Q_DECLARE_PUBLIC ermöglicht den Zugriff auf die Schnittstelle vom PIMPL aus. Es generiert Inline-Implementierungen der q_func()-Hilfsmethode, ähnlich wie d_func().
Das PIMPL-Idiom kann auch für kopierbare Nicht-QObject-Klassen verwendet werden. Der PIMPL-Zeiger darf jedoch nicht konstant sein. Die Viererregel (Kopierkonstruktor, Verschiebungskonstruktor, Zuweisungsoperator, Destruktor) und eine freistehende Swap-Funktion sollten implementiert werden.
Das obige ist der detaillierte Inhalt vonWie verwende ich das Qt PIMPL-Idiom in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!