d-pointerはQtで頻繁に使用され、pimplイディオムの実装です。私はpimplイディオムの長所と短所を知っています。しかし、dポインターの実装の利点を見逃してしまいました。こことここにdポインタのサンプルがあります。これだけ使うほうが簡単ではないですか?
class MyClassPrivate;
class MyClass {
// interface methods
private:
MyClassPrivate *pimpl_;
};
dポインターは、多くの中で、pimplパターンの1つの実装です。これは初期の実装の1つでもあります。「「d-pointer」という名前は、Qtにこの手法を最初に導入したTrolltechのArnt Gulbrandsenに由来し、より大きなリリース間でもバイナリ互換性を維持する最初のC++GUIライブラリの1つになりました。」ソース
マクロを使用する利点の1つは、コンパイル時に中央の場所でパターン実装の実装の詳細を変更できることです。たとえば、大量のコードを変更せずに、後で高速pimpl実装に切り替えるオプションを残すようにマクロを設計できます(pimplを使用している場合はこれが不要になることを願っています:-))。マクロの設計/実装に間違いがなかった場合...
ただし、個人的には、pimplの実装にマクロを使用しないことをお勧めします。マクロは、ソースツリーの新規参入者にはわかりにくいためです。マクロは魔法の方言を作成しますが、これはエラーが発生しやすく、元のソースコードほど意味がありません。また、Cプリプロセッサに関連するすべての問題が発生します。基礎となる言語を認識していません。
個人的には、d-referenceと呼んでいるものを使用するのが好きです。ポインタの代わりに参照を使用し、d参照する必要はありません。8-)次のようになります。
// MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
// implementation methods
private:
class MyClassPrivate& d;
};
// MyClass.cpp
struct MyClassPrivate
{
int x;
};
MyClass::MyClass()
: d(*new MyClassPrivate)
{
}
MyClass::~MyClass()
{
delete &d;
}
// In methods use d.x
d-pointerパターンのマクロのセットは、ある種の便利さと一貫性を提供します。たとえば、Q_DECLARE_PRIVATEは、Fooのpimplプライベートクラスの名前がFooPrivateであること、FooPrivateがFooと提携していること、d_func()という優れたインライン関数(constバージョンとnonconstバージョンの両方)を作成することを保証します。後者はQ_Dマクロで使用され、基本的にプライベートクラスインスタンスを指すスコープ/ローカル変数dを作成します。
つまり、Q_DECLARE_PRIVATEやその他のマクロを使用する必要はありませんが、使用すると、コードがより短く、よりクリーンで、一貫性のあるものになります。
dポインターは、実際には、pimplイディオムを実装するためのいくつかの便利なマクロにすぎないと思います。これらすべてのマクロの定義を見てください:Q_D
、、、Q_Q
など。これらはpimplQ_DECLARE_PRIVATE
の一部のショートカットにすぎません。たとえば、ほとんどの場合、元のクラスへの参照をプライベートクラスに保持する必要があります。あり、これのために。結局のところ、マクロを使用すると、すべてのチームがpimplを統一的に実装する必要があります。そうでなければ、プライベートポインタを呼び出す人もいれば、この混乱を想像する人もいます。Q_Q
Q_DECLARE_PUBLIC
d
pimpl_