2010-11-29 1 views
0

개인 템플릿으로 템플릿 클래스에 대한 포인터가있는 클래스를 정의하고 있습니다. 그런 수업의 디자인에 관한 질문이 있습니다. 보다 정확하게는 외부 클래스가 템플릿 화되어야하는지 여부입니다. 외부 클래스의 생성자에서 private 멤버를 초기화 중이므로 그렇게하는 것이 옳습니다. 다른 대안이 있습니까? 클래스 선언의 예는 아래와 같습니다 모든 제안을 환영합니다 :중첩 템플릿 클래스 디자인

#include <foo.h> 
#include <bar.h> 

template < class FOO_TYPE, class BAR_TYPE > 
class OuterClass{ 
    public: 

     OuterClass(){ 
      this->m_pFoo = new CFoo<FOO_TYPE>(); 
      this->m_pBar = new CBar<BAR_TYPE>(); 
      this->m_nMyInt = 0; 
     } 

     template < class FOO_TYPE > 
     CFoo<FOO_TYPE> * processFoo(); 

     template < class BAR_TYPE > 
     CBar<BAR_TYPE> * processBar(); 

     ~OuterClass(){ 
      delete this->m_pFoo; 
      delete this->m_pBar; 
     } 

    private: 
     int m_nMyInt; 
     CFoo<FOO_TYPE> * m_pFoo; 
     CBar<BAR_TYPE> * m_pBar; 
}; 

답변

1

외부 클래스의 의도 된 사용에 따라 달라집니다. 코드에 따르면 OuterClass을 다른 템플릿 유형과 함께 사용할 수 있으므로 템플릿으로 사용하는 것이 좋습니다. 사실, 이러한 종류의 템플릿 인수 전달은 매우 일반적입니다. 오히려 OuterClassCFooCBar의 특정 템플릿 특수화를 사용하려면

그러나, 당신은 단지 해당 멤버의 선언에 FOO_TYPEBAR_TYPE를 원하는 지정할 수 있습니다.

1

클래스 내에 processFoo() 및 processBar()가 잘못 정의되었습니다.

이들은 클래스 내에서 템플릿 기능이 아니며 특히 첫 번째 및 두 번째 템플릿 매개 변수에 입력됩니다.

CFoo와 CBar는 외부 템플릿으로 보입니다.

클래스는 또한 복사 생성 및 할당과 관련하여 "규칙 3"에도 불구하고 CBar 생성자가 throw하는 경우 예외가 아닙니다 (생성자가 던져 버리면 소멸자가 호출되지 않고 m_pFoo는 절대로 삭제되지 않습니다.)

+0

+1 "규칙 3"에 대해, 나는 그것을 놓쳤다 고 생각할 수 없다. 'processFoo'와'processBar'에 관해서는 – Mephane

+0

입니다. 맞습니다. 외부 클래스가 템플릿 화되지 않은 경우에만 나타납니다. 게다가 전체 코드를 넣지는 않았지만 당신이 맞습니다. 복사 생성자와 할당 방법이 필요합니다. – Javier