2010-02-02 7 views
0

나는 다음과 같은 C++에 불투명 한 물체를 수행하는 방법을 알고 : 불투명 한 물체가 다른 네임 스페이스에서 기존 클래스 템플릿은 포함하지 않고있을 때 그것을 수행하는 방법 이제불투명 객체는

// my_class.hpp 
class opaque_object; 
class my_class { 
    my_class(); 
    ~my_class(); 
    opaque_object *m_opaque_object; 
}; 

// my_class.cpp 
#include <my_class.hpp> 
class opaque_object { 
    // ... 
}; 
my_class::my_class() { m_opaque_object = new opaque_object(); } 
my_class::~my_class() {delete m_opaque_object; } 

이 헤더 파일. 다음 코드는 좋지 않습니다. 단지 내 문제를 설명하기위한 것입니다.

// my_class.hpp 
class third::party::library::opaque_object< 
    third::party::library::templated_class>; 

class my_class { 
    my_class(); 
    ~my_class(); 
    third::party::library::opaque_object< 
     third::party::library::templated_class> *m_opaque_object; 
}; 

// my_class.cpp 
#include <my_class.hpp> 
#include <third/party/library/opaque_object.hpp> 
#include <third/party/library/template_class.hpp> 

typedef third::party::library::opaque_object< 
    third::party::library::templated_class> opaque_object; 

my_class::my_class() { m_opaque_object = new opaque_object(); } 
my_class::~my_class() {delete m_opaque_object; } 

내 소스 코드의 실제 클래스

훨씬 더 (자체 템플릿 클래스입니다 그들 중 일부와 템플릿의 4 개 인수)이 예보다 템플릿된다.

my_class.hpp가 프로젝트의 모든 곳에서 사용되기 때문에 일반적인 컴파일 작업에는 각 cpp 파일에 대해 my_class.hpp를 포함하는 데 5 초가 소요되므로 opaque_object.hpp, template_class를 포함하지 않으려합니다. hpp ... my_class.hpp에 있습니다.

어떻게이 작업을 수행 할 수 있습니까? 모든 의견이나 아이디어는 환영합니다. 미리 감사드립니다.

+0

누군가가 게시물 플래그에 불투명 포인터를 추가 할 수 있습니다 (필자는 자신에게 충분한 평판을 얻지 못했습니다). 미리 감사드립니다! – Phong

+1

이 태그가 더 잘 작동하고 이미 존재한다고 생각합니다. 죄송합니다, dirkgently :) – GManNickG

+0

@GMan : wikipedia에서 pimpl 관용구가 직접 불투명 한 포인터로 리디렉션됩니다! 하지만 "핸들 클래스", "Pimpl 관용구", "컴파일러 방화벽 관용구"또는 "Cheshire Cat"이라고도합니다. (처음으로 내 인생에서 pimpl 관용구에 대해 듣고, 공유 주셔서 감사합니다) – Phong

답변

0

각 템플릿 클래스뿐만 아니라 템플릿으로 필요한 각 클래스를 선언 할 필요가 모르는하지 인수)를 올바른 네임 스페이스와 비교합니다.

0

왜 (템플릿 그것을 템플릿 템플릿 매개 변수 (당신이 거기 이상의 매개 변수를 필요로하는 경우 :

template <typename T, template <class> typename opaque> 
class my_class 
{ 
... 
    opaque<T>* opaque_; 
}; 
+0

아주 우아한 방법입니다! 하지만 내 프로그램에서이 객체를 구현할 때마다 틀린 것이 아니라면 템플릿 인자를 정의해야합니다 ... – Phong