2011-02-13 5 views
9

d- 포인터는 Qt에서 많이 사용되며 pimpl 관용구를 구현 한 것입니다. 나는 pimpl 관용구의 장단점을 안다. 그러나 나는 d- 포인터 구현의 장점을 놓쳤다. Herehere은 d- 포인터의 샘플입니다. 이것을 사용하는 것이 더 쉽지 않습니까?d- 포인터를 사용할 때 장단점은 무엇입니까?

class MyClassPrivate; 
class MyClass { 
    // interface methods 
private: 
    MyClassPrivate *pimpl_; 
}; 
+2

"그냥 pimpl"과 d- 포인터 사이에는 어떤 차이점이 있습니까? 매크로를 사용하여 작업을 자동화하는 경우는 제외됩니다. –

답변

3

d- 포인터 패턴에 대한 매크로 집합은 일종의 정렬 편의성과 일관성을 제공합니다. 예를 들어, Q_DECLARE_PRIVATE는 Foo에 대한 pimpl private 클래스가 FooPrivate, FooPrivate가 Foo와 이름이 지정되고 d_func()라는 멋진 인라인 함수 (const 및 nonconst 버전 모두)를 작성하도록합니다. 후자는 기본적으로 개인 클래스 인스턴스를 가리키는 범위/지역 변수 d를 작성하는 Q_D 매크로에서 사용됩니다.

요약하면 Q_DECLARE_PRIVATE 및 다른 매크로는 사용할 필요가 없지만 그렇게하면 코드가 더 짧고 깨끗하며 일관성있게됩니다.

0

나는 D-포인터 정말 pimpl 관용구를 구현하기위한 몇 가지 편리한 매크로 있다고 생각합니다. 이 모든 매크로의 정의를 살펴보십시오 : Q_D, Q_Q, Q_DECLARE_PRIVATE핌플의 부분에 대한 바로 가기입니다. 예를 들어 프라이빗 클래스에서 원래 클래스에 대한 참조를 유지하려는 경우가 대부분입니다. 이 경우 Q_QQ_DECLARE_PUBLIC이 있습니다. 결국 매크로를 사용하면 모든 팀이 핌플의 균일 한 구현을 수행해야합니다. 그렇지 않으면 어떤 사람들은 개인 포인터를 d, 다른 사람은 pimpl_이라고 부르며,이 혼란을 상상해보십시오.

13

d- 포인터는 대부분 pimpl 패턴 중 하나의 구현입니다. 또한 초기 구현 중 하나입니다. "이름 'd-pointer'는 Qt에 처음 도입 된 Trolltech의 Arnt Gulbrandsen에서 유래되었습니다. 더 큰 릴리즈 사이에서도 바이너리 호환성을 유지할 수있는 최초의 C++ GUI 라이브러리 중 하나입니다. "Source

매크로를 사용할 때의 이점 중 하나는 컴파일시 중앙 위치에서 패턴 구현의 구현 세부 사항을 변경하는 것입니다. 예를 들어 코드 톤을 변경하지 않고 나중에 fast pimpl implementation으로 전환 할 수있는 옵션을 남겨 두도록 매크로를 디자인 할 수 있습니다 (잘하면 pimpl을 사용하는 경우에는 필요하지 않음 :-)). 매크로 디자인/구현에서 실수를하지 않았다면 ...

그러나 원본 트리에 대한 어떤 새로운 사용자도 암호를 사용하지 않으므로 매크로를 사용하지 않는 것이 좋습니다. 매크로는 종종 오류가 발생하기 쉽고 원본 소스 코드만큼 의미가없는 마법의 방언을 만듭니다. 또한 C Pre Processor와 관련된 모든 문제가 있습니다. 기본 언어를 인식하지 못합니다.

개인적으로 나는 d- 참조라고 부르는 것을 사용하고 싶습니다. 포인터 대신에 참조를 사용하고 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 
+0

정말 대단해, ​​고마워. :) –

관련 문제