13,005
回編集
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> |