Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich das Qt PIMPL-Idiom in C?

Wie verwende ich das Qt PIMPL-Idiom in C?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-23 14:44:44764Durchsuche

How to Use the Qt PIMPL Idiom in C  ?

Verwendung des PIMPL-Idioms von Qt

Einführung

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 Schnittstelle

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 &amp;);
};</code>

Hier , das Makro Q_DECLARE_PRIVATE deklariert die PIMPL-Klasse und stellt die notwendigen Mechanismen für den Zugriff darauf bereit.

Die Implementierung

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>

Q_DECLARE_PRIVATE

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.

Q_PRIVATE_SLOT

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.

Q_DECLARE_PUBLIC

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().

Häufige Fallstricke

  • Die PIMPL-Klasse sollte keine private Klasse innerhalb der Schnittstellenklasse selbst sein.
  • Der PIMPL-Zeiger sollte für nicht kopierbare/nicht zuweisbare Klassen wie QObject const sein.
  • Vermeiden Sie aus Leistungsgründen die Verwendung von „placement new“ und der Fast Pimpl-Sprache.

Kopierbare Nicht-QObject-Klassen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn