2012-04-18 10 views
0

タイトルと同様に、QObjectの "this"ポインタに "q_ptr"ポインタが割り当てられているのはなぜですか?ソースコードです。QObjectの "this"ポインタに "q_ptr"ポインタが割り当てられているのはなぜですか?

使用ブローのようなソースコードで Q_Q()マクロそして
QObject::QObject(QObjectPrivate &dd, QObject *parent) 
: d_ptr(&dd) 
{ 
>>Q_D(QObject); 
>>d_ptr->q_ptr = this;/*question*/ 
....... 

、すべて我々よう

QWidget*q_func() {return static_cast<QWidget*>(q_ptr);} 

Q_Q(QWidget) 

それは関数q_funによって処理Qポインタ()戻ります知っている、static_castは、親から子へのキャスト時には安全ではありません。

私は非常に約/*question*/を欲しています、誰か私に秘密を教えることができますか?ありがとう!プライベート実装オブジェクト(PIMPL idiom)は、それが(非プライベートQObject)で/のために働いているオブジェクトについて語られている

+0

セマンティックノート: 'this'は' q_ptr'に割り当てられていますが、他の方法ではありません。 'a = b;':bの値はaに割り当てられます(つまり、aの値はbの値をとります) – tmpearce

+0

hehe、ご意見ありがとうございました –

答えて

2
d_ptr->q_ptr = this;/*question*/ 

これがされています。 Qtについての情報はHere's a good linkd pointers(d_ptr)です。

Q_Qマクロは、QObjectへのポインタを返します。そのため、(特に)シグナルを放出することができます。 static_castビットは、マクロがQ_DECLARE_PRIVATEQ_DECLARE_PUBLICのマクロで作成されたクラスごとに別々に定義されているため安全です。その結果、static_castは常に正しい型にキャストされます。繰り返しますが、リンクを読むことをお勧めします。

+0

私はこのリンクを前に読んでいます。 –

+0

私は、qポインタについての多くの記事が常に以下のようなq_ptrの割り当てを記述していることを発見しました:MyObjectPrivate(MyObject * parent):q_ptr(parent){}これはq_ptrがパブリッククラスMyObject.howeverを指していることを、 Qtの方法を理解する方法:d_ptr-> q_ptr = this。 "this"は常にQObjectを指し示しますが、指し示すプライベートクラスd_ptrのパブリッククラスを指しません。 –

+0

投稿したQObjectのコンストラクタに気づいた場合、QObjectPrivateは引数として参照渡しされます。これはプライベートオブジェクトが最初に構築されたことを示していますので、(あなたのコメントの)構文がうまくいかない - privateのコンストラクタに渡すpublic QObjectはありません!したがって、プライベートオブジェクトが最初に構築され、パブリックオブジェクトが構築されると、プライベートオブジェクトへのポインタが与えられます。あなたが投稿したコードを正確に入手した場所へのリンクを含めることができれば、私はさらに見ることができます。 – tmpearce

関連する問題