Maison >développement back-end >C++ >Comment utiliser l'idiome Qt PIMPL en C ?
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 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 &); };</code>
Ici , la macro Q_DECLARE_PRIVATE déclare la classe PIMPL et fournit les mécanismes nécessaires pour y accéder.
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>
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.
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.
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().
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!