2012-04-18 2 views
0

제목과 마찬가지로 QObject의 "this"포인터에 "q_ptr"포인터가 할당 된 이유는 무엇입니까? 소스 코드에서. 그런 다음QObject의 "this"포인터에 "q_ptr"포인터가 할당 된 이유는 무엇입니까?

QObject::QObject(QObjectPrivate &dd, QObject *parent) 
: d_ptr(&dd) 
{ 
>>Q_D(QObject); 
>>d_ptr->q_ptr = this;/*question*/ 
....... 

때 타격과 같은 소스 코드에서 사용 Q_Q() 매크로 :

Q_Q(QWidget) 

이 함수 q_fun (처리 질문 포인터) 반환합니다 : 모든으로

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

을 우리 부모로부터 자녀에게 전송할 때 static_cast은 안전하지 않습니다.

나는 매우 /*question*/에 대해 좌절하고있다. 어떤 사람이 나에게 비밀을 말 할 수 있는가? 고마워! 민간 구현 객체 (PIMPL idiom)이 그것 (비 개인 QObject)과/근무하고있는 객체에 대해 이야기한다

+0

시맨틱 노트 :'this'는'q_ptr'에 할당되어 있습니다. 'a = b;': b의 값은 a에 할당됩니다. 즉, b의 값을 취합니다. – tmpearce

+0

hehe, 의견을 보내 주셔서 감사합니다. –

답변

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

이된다. Qt에 관한 정보는 Here's a good link이고 d pointer (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가 없습니다! 그래서 private 객체가 먼저 생성되고, public 객체가 생성되면 private 객체에 대한 포인터를 제공합니다. 게시 한 코드가있는 위치에 대한 링크를 포함시킬 수 있다면 더 자세히 살펴볼 수 있습니다. – tmpearce

관련 문제