PIMPL (実装へのポインタ) イディオムを使用すると、パブリック インターフェイスをプライベート実装の詳細から分離できます。クラスを使用することで、クラスのユーザーがそれらの詳細に関心を持つことがなくなります。 Qt は、以下に説明する PIMPL イディオムの独自の実装を採用しています。
Qt の PIMPL ベースのインターフェイスは次のようになります:
<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>
こちら、Q_DECLARE_PRIVATE マクロは、PIMPL クラスを宣言し、それにアクセスするために必要なメカニズムを提供します。
PIMPL クラス CoownedDialogPrivate は、実装ファイルで定義されます:
<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 マクロは、PIMPL クラスの宣言を簡素化し、それをインターフェイス クラスに関連付けます。 d_func() ヘルパー メソッドのインライン実装を生成し、適切な定数で PIMPL へのアクセスを提供します。
このマクロは、Qt 4 との互換性のために、または非 C 11 をターゲットとする場合に使用されます。コンパイラ。内部使用のためのプライベート スロットを宣言します。
Q_DECLARE_PUBLIC マクロは、PIMPL からインターフェイスへのアクセスを提供します。 d_func() と同様に、q_func() ヘルパー メソッドのインライン実装を生成します。
PIMPL イディオムは、コピー可能な非 QObject クラスにも使用できます。ただし、PIMPL ポインタは非定数でなければなりません。 4 つの規則 (コピー コンストラクター、移動コンストラクター、代入演算子、デストラクター) と独立したスワップ関数を実装する必要があります。
以上がC で Qt PIMPL イディオムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。