设计嵌套模板类

时间:2010-11-29 14:18:05

标签: c++ templates nested-class

我正在定义一个类,它具有指向模板化类的私有成员指针。我对这类课程的设计有疑问。更准确地说,外层阶级是否应该被模板化。 因为,我正在初始化外部类的构造函数中的私有成员,我想,这样做是正确的。还有其他选择吗? 下面给出了一个类声明示例,欢迎所有建议:

 #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 个答案:

答案 0 :(得分:1)

这取决于外部类的预期用法。您的代码表明OuterClass可以与不同的模板类型一起使用,因此将它作为模板也是有意义的。实际上,这种模板参数转发很常见。

但是,如果您希望OuterClass仅使用CFooCBar的特定模板专精,那么您只需指定所需的FOO_TYPE和{{1}在相应成员的声明中。

答案 1 :(得分:1)

在您的类中,processFoo()和processBar()定义不正确。

它们不是您班级中的模板化函数,它们是专门为您的第一个和第二个模板参数键入的。

CFoo和CBar似乎是外部模板。

关于复制构造和赋值,你的类也失败了“3规则”,如果CBar的构造函数抛出(在这种情况下你的构造函数将抛出,你的析构函数永远不会被调用和m_pFoo),那么它不是异常安全的永远不会被删除)。