2010-08-11 5 views
0

클래스 템플릿의 계층 구조가 있습니다. 계층 구조 맨 위에는 추상 기본 클래스 (인터페이스)가 있습니다. 런타임까지 인스턴스화 할 구체 구현을 알 수 없으므로 팩토리 패턴을 사용하는 완벽한 상황 인 것 같습니다. 그러나 C++에서는 가상 멤버 함수 템플릿을 사용할 수 없습니다.C++의 공장 패턴 및 클래스 템플릿

C++에서 아래와 비슷한 합법적 인 디자인을 어떻게 얻을 수 있습니까?

구체적인 공장뿐만 아니라 IProduct 인터페이스의 개별 구체적인 구현은 여러 동적 라이브러리에 있으며 하나 이상의 런타임은 런타임에로드됩니다.

template<class T> class IProduct 
{ 
public: 
    virtual void doWork(const T & data) = 0; 
}; 

template<class T> class ProductA : public IProduct<T> {/*...*/}; 
template<class T> class ProductB : public IProduct<T> {/*...*/}; 

class IProductFactory 
{ 
public: 
    template<class T> virtual IProduct<T> * createProduct() = 0; 
}; 

class ProductAFactory: public IProductFactory 
{ 
public: 
    template<class T> virtual IProduct<T> * createProduct() 
    { 
     return new ProductA<T>; 
    } 
}; 

class ProductBFactory: public IProductFactory 
{ 
public: 
    template<class T> virtual IProduct<T> * createProduct() 
    { 
     return new ProductB<T>; 
    } 
}; 
+0

템플릿 매개 변수를 어떻게 사용합니까? 표시된 것처럼, 그냥 자핑을 해야하는 것 같습니다. – zwol

+0

@Zack에서는 템플릿 매개 변수가 인터페이스 기능 중 하나의 매개 변수 유형으로 사용됩니다. 나는 분명히 할 것이다. –

+1

설명과 같이 인스턴스화 문제를 묻습니다. 누군가 주 프로그램에서 요구하는 모든 T에 대해'ProductA :: doWork','ProductB :: doWork' 등을 인스턴스화해야합니다. ProductA, ProductB , etc가 공유 라이브러리에 숨어 있다면 그렇게 할 수 없습니다. – zwol

답변

3

왜 당신은뿐만 아니라 TIProductFactory을 템플리트화할 수없는 이유는 무엇입니까? 그건 당신의 실수를 없앨 것이고 덜 일반적이기도합니다. 클라이언트는 createProduct 메서드를 호출하기 위해 무엇이 T인지 계속 알 필요가 있습니다.

편집 제목 : Re :이 작업을 수행하기 위해

주석, 당신은 단지 공장을 만드는 플릿 함수를 작성해야합니다. 그래서 :

template<class T> IProductFactory<T>* getProductFactory(); 

는 이제 공장 플릿되면, createProduct 방법은 더 이상 멤버 템플릿입니다. ProductAFactoryProductBFactory을 반환하기위한 기준이 무엇인지는 확실하지 않지만 선택하려면 문자열을 전달하거나, 결정을 내릴 다른 클래스의 멤버 함수이거나, 여러 개의 무료 함수가 있지만 공개 만해야합니다. 특정 클라이언트에 대한 하나의 버전 또는 다른 버전.

+0

네, 그게 유일한 의미있는 해결책입니다. –

+0

나는 그것도 생각했다. 그러나 문제를 더 높은 수준의 수업으로 밀어 넣는 것이 아닌가? IProduct를 만들고자하는 클라이언트를 고려하십시오 . 클라이언트는 여전히 적절한 콘크리트 IProductFactory 을 가져와야합니다. 즉, IProductFactory 을 다형성으로 만들 수있는 무언가가 있어야합니다. 내가 놓친 게 있니? –

-1

템플릿이 필요하지 않습니다. 그게 당신의 문제를 제거합니까?

+0

제발 자세히 ... 어떻게 디자인에서 템플릿 매개 변수를 제거합니까? –