ホームページ  >  記事  >  バックエンド開発  >  C で Qt PIMPL イディオムを使用する方法

C で Qt PIMPL イディオムを使用する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-23 14:44:44766ブラウズ

How to Use the Qt PIMPL Idiom in C  ?

Qt の PIMPL イディオムの使用

はじめに

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

Q_DECLARE_PRIVATE マクロは、PIMPL クラスの宣言を簡素化し、それをインターフェイス クラスに関連付けます。 d_func() ヘルパー メソッドのインライン実装を生成し、適切な定数で PIMPL へのアクセスを提供します。

Q_PRIVATE_SLOT

このマクロは、Qt 4 との互換性のために、または非 C 11 をターゲットとする場合に使用されます。コンパイラ。内部使用のためのプライベート スロットを宣言します。

Q_DECLARE_PUBLIC

Q_DECLARE_PUBLIC マクロは、PIMPL からインターフェイスへのアクセスを提供します。 d_func() と同様に、q_func() ヘルパー メソッドのインライン実装を生成します。

よくある問題

  • PIMPL クラスは、インターフェイス クラス自体内のプライベート クラスであってはなりません。
  • QObject のようなコピー不可/代入不可能なクラスの場合、PIMPL ポインターは const である必要があります。
  • パフォーマンス上の理由から、placement new と Fast Pimpl イディオムの使用は避けてください。

Non-QObject Copyable Classes

PIMPL イディオムは、コピー可能な非 QObject クラスにも使用できます。ただし、PIMPL ポインタは非定数でなければなりません。 4 つの規則 (コピー コンストラクター、移動コンストラクター、代入演算子、デストラクター) と独立したスワップ関数を実装する必要があります。

以上がC で Qt PIMPL イディオムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。