2008-10-15 5 views
5

내 프로그램의 클래스 중 일부는 타사 라이브러리를 사용합니다. - 3P 헤더를 포함하도록 구성되어야 내 클래스를 사용하여 내 프로그램의 다른 유닛이와C++ 헤더 - 인터페이스와 구현 세부 사항 간의 분리

// My.h 
    #include <3pheader.h> 

    class My 
    { 
    ... 
    private: 
     3pObject m_object; 
    } 

문제 : 도서관 개체 내 클래스의 private 멤버입니다. 다른 종류의 3p로 이동하면 전체 빌드가 위태로워 질 것입니다 ... 이 문제를 해결하는 두 가지 방법이 있습니다. 하나는 3pObject extern을 만들고 m_Object를 포인터로 바꾸고 생성자에서 초기화하는 것입니다. 두 번째는 "인터페이스"및 "팩토리"클래스를 만들고이를 내보내는 것입니다. ...

다른 문제를 해결 하시겠습니까?

답변

11

사용 "pimpl"관용구 :

// header 
class My 
{ 
    class impl; 
    std::auto_ptr<impl> _impl; 
}; 

// cpp 
#include <3pheader.h> 
class My::impl 
{ 
    3pObject _object; 
}; 
+0

boost :: scoped_ptr을 사용하지 않는 이유는 무엇입니까? – grigy

+0

아무 것도 지정하지 않았습니다. auto_ptr 사용에 익숙합니다.이 경우 소유권 이전이 없으므로 scoped_ptr을 사용하는 것이 더 적절할 수 있습니다 –

13

프라이빗 구현 (PIMPL) 패턴 : 기본적으로

http://www.codeproject.com/KB/tips/PIMPL.aspx

, 당신은 당신의 클래스는 앞으로 선언 구조체에 대한 포인터를 보유하고 있음을 정의합니다. 그런 다음 cpp 파일 내부에 구조체를 정의하고 클래스의 생성자와 소멸자를 사용하여 PIMPL을 작성/삭제합니다.

:

0

QT의 내부 구조의 모든 민간 구현 클래스를 사용하여 수행됩니다.
올바르게 수행 된 방법에 대한 좋은 참고 자료를 찾을 수 있습니다.

관련 문제