2010-11-29 4 views
0

Я определяю класс, который имеет как частные члены указатели на шаблонные классы. У меня вопрос о дизайне такого класса. Точнее, должен ли быть шаблонный внешний шаблон или нет. Поскольку я инициализирую частные члены в конструкторе внешнего класса, я думаю, это правильно. Есть ли другие альтернативы? Пример декларации класса приводится ниже, и все предложения приветствуются:проектирование вложенных шаблонных классов

#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 может использоваться с разными типами шаблонов, поэтому имеет смысл иметь его как шаблон. На самом деле такая пересылка аргументов шаблона очень распространена.

Однако, если вы хотите, а OuterClass использовать только определенные специализации шаблонных CFoo и CBar, то вы можете просто указать желаемый FOO_TYPE и BAR_TYPE в декларации соответствующих членов.

1

Внутри вашего класса методыFoo() и processBar() определены неправильно.

Они не являются шаблонами функций внутри вашего класса, они специально введены в ваш первый и второй параметры шаблона.

CFoo и CBar являются внешними шаблонами.

Ваш класс также не выполняет «правило 3» в отношении создания и назначения копий и не является безопасным исключением, если конструктор бросков CBar (в этом случае ваш конструктор будет бросать, ваш деструктор никогда не будет вызван и m_pFoo никогда не удаляется).

+0

+1 для «правила 3», я не могу поверить, что пропустил это. – Mephane 2010-11-29 14:48:55

Смежные вопросы