Maison >développement back-end >C++ >Comment utiliser l'idiome Qt PIMPL en C ?

Comment utiliser l'idiome Qt PIMPL en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-23 14:44:44847parcourir

How to Use the Qt PIMPL Idiom in C  ?

Utilisation de l'idiome PIMPL de Qt

Introduction

L'idiome PIMPL (Pointer to Implementation) permet de séparer l'interface publique des détails d'implémentation privés de une classe, empêchant les utilisateurs de la classe de se préoccuper de ces détails. Qt utilise sa propre implémentation de l'idiome PIMPL, qui est documentée ci-dessous.

L'interface

L'interface basée sur PIMPL pour Qt se présente comme suit :

<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>

Ici , la macro Q_DECLARE_PRIVATE déclare la classe PIMPL et fournit les mécanismes nécessaires pour y accéder.

L'implémentation

La classe PIMPL, CoordonnéeDialogPrivate, est définie dans le fichier d'implémentation :

<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

La macro Q_DECLARE_PRIVATE simplifie la déclaration de la classe PIMPL et l'associe à la classe d'interface. Il génère des implémentations en ligne de la méthode d'assistance d_func(), qui fournit un accès au PIMPL avec la constance appropriée.

Q_PRIVATE_SLOT

Cette macro est utilisée pour la compatibilité avec Qt 4 ou pour cibler des versions non-C 11. compilateurs. Elle déclare un slot privé à usage interne.

Q_DECLARE_PUBLIC

La macro Q_DECLARE_PUBLIC permet d'accéder à l'interface depuis le PIMPL. Il génère des implémentations en ligne de la méthode d'assistance q_func(), similaire à d_func().

Common Gotchas

  • La classe PIMPL ne doit pas être une classe privée au sein de la classe d'interface elle-même.
  • Le pointeur PIMPL doit être const pour les classes non copiables/non assignables comme QObject.
  • Évitez d'utiliser le placement new et l'idiome Fast Pimpl pour des raisons de performances.

Classes copiables non-QObject

L'idiome PIMPL peut également être utilisé pour les classes copiables non-QObject. Cependant, le pointeur PIMPL doit être non const. La règle de quatre (constructeur de copie, constructeur de déplacement, opérateur d'affectation, destructeur) et une fonction d'échange autonome doivent être implémentées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn