проектирование вложенных шаблонных классов - PullRequest
0 голосов
/ 29 ноября 2010

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

 #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;
 };

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

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

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

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

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

1 голос
/ 29 ноября 2010

Это зависит от предполагаемого использования внешнего класса. Ваш код предполагает, что OuterClass можно использовать с различными типами шаблонов, поэтому имеет смысл также использовать его в качестве шаблона. На самом деле, такая пересылка аргументов шаблона очень распространена.

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

...