「Qtの基礎 - プリプロセッサ」の版間の差分

ナビゲーションに移動 検索に移動
550行目: 550行目:
     qDebug() << data2.value();  // 出力: 100
     qDebug() << data2.value();  // 出力: 100
  }
  }
</syntaxhighlight>
<br>
==== Q_D / Q_Q ====
d-pointerイディオムの実装時において、privateクラスとpublicクラス間のアクセスを容易にする。<br>
<br>
Q_Dマクロは、publicクラスからprivateクラスにアクセスするために使用する。<br>
Q_Qマクロは、privateクラスからpublicクラスにアクセスするために使用する。<br>
<br>
これらのマクロを使用することにより、以下に示すようなメリットがある。<br>
* private実装とpublicインターフェース間のアクセスを簡潔に記述することができる。
* タイプセーフなアクセスが可能になる。
* ソースコードの可読性が向上する。
<br>
以下の例では、publicクラスとprivateクラス間で相互にアクセスする方法を示している。<br>
これにより、実装の詳細を隠蔽しつつ、必要な場合に内部データにアクセスすることができる。<br>
<syntaxhighlight lang="c++">
// MyClass.hファイル
#include "MyClassPrivate.h"
class MyClassPrivate;
class MyClass
{
private:
    Q_DECLARE_PRIVATE(MyClass)
    MyClassPrivate *d_ptr;
public:
    MyClass() : d_ptr(new MyClassPrivate(this)) {}
    ~MyClass()
    {
      delete d_ptr;
    }
    void publicMethod()
    {
      Q_D(MyClass);  // d は MyClassPrivate* 型
      d->privateMethod();
      qDebug() << "Public method called, someData:" << d->someData;
    }
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// MyClassPrivate.hファイル
class MyClassPrivate
{
public:
    MyClassPrivate(MyClass *q) : q_ptr(q) {}
    void privateMethod()
    {
      Q_Q(MyClass);  // qはMyClass*型
      someData = 42;
      qDebug() << "Private method called by" << q;
    }
    MyClass *q_ptr;
    Q_DECLARE_PUBLIC(MyClass)
    int someData;
};
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー