2010-11-29 143 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使用的CFooCBar只有特定的模板特化,那么你可以在相应的会员申报所需FOO_TYPEBAR_TYPE

1

您的类中的processFoo()和processBar()被错误地定义。

它们不是类中的模板函数,它们是专门输入到第1个和第2个模板参数中的。

CFoo和CBar看起来是外部模板。

你的班级在复制构造和赋值方面也失败了“3规则”,如果CBar的构造函数抛出(在这种情况下你的构造函数会抛出,你的析构函数永远不会被调用, m_pFoo永远不会被删除)。

+0

+1“3的规则”,我不能相信我错过了。 – Mephane 2010-11-29 14:48:55