2013-03-20 4 views
-3

거의 모든 것이 궁금하지만, 템플릿 클래스에서 불투명 ptr을 사용하여 얻는 캡슐화를 얻을 수있는 방법이 있습니까? 컴파일러는 컴파일 타임에 모든 것을 알고 있어야하기 때문에 내 직감은 "아니오"입니다.템플릿과 불투명 포인터가 서로 상반되게 호환되지 않습니까?

이와 비슷한 MyClass는 정적 라이브러리를 통해 노출되어야하며 MyClassImp는 숨겨져 있어야합니다.

//MyClass.h 
template <typename T> MyClassImp; 

template <typename T> MyClass 
{ 
public: 
    MyClass(); 
    void Foo(); 
private: 
    MyClassImp<T>* impl; 
} 
//MyClassImp.h 
template <typename T> MyClassImp 
{ 
public: 
    MyClassImp() {} 
    void Foo() {/*proprietary/complex stuff I want to hide*/} 
} 
//MyClass.cpp 
template <typename T> 
MyClass::MyClass() 
{ 
    impl = new MyClassImp(); 
} 
template <typename T> 
void MyClass::Foo() { impl->Foo(); } 

.cpp 파일에 숨겨진 MyClass에 :: 푸, MyClassImp의 정의를 포함하지 않고 노출 될 수 없기 때문에 당신이 기능없는 오류가 발생하므로이 작동하지 않습니다.

답변

1

호환되지 않아야하는 이유는 없습니다. 모든 컴파일러는 알아야 할 것은 포인터가 있다는 것입니다. 그리고 그 문자 옆에 작은 *이 있습니다. 하지만 코드 스 니펫에는 많은 오류가 있습니다. 이 컴파일보십시오 :

template <typename T> class MyClassImp; 

template <typename T> class MyClass 
{ 
private: 
    MyClassImp<T>* impl; 
}; 

int main() 
{ 
    MyClass<int> a; 
    return 0; 
} 

을 주목 class 키워드를 템플릿과 정의 후 ;를 정의 할 때. 당신이 그것을 시도했다면, 당신은 알 것입니다. 당신과 함께 위의 코드를 컴파일 할 수

g++ -std=c++98 -pedantic -Wall -Wextra a.cpp 

하고 당신이 얻을 수있는 유일한 경고 a 사용하지 않는 것입니다.

+0

그래, 미안해, 그냥 psudo 코드를 던졌다. 문제는 impl에서 무엇인가를 사용한다면 헤더 파일에 전체 클래스를 선언해야한다는 것이다. 즉, opaque ptr의 목적을 무효화해야한다. – IdeaHat