我正在定义一个类,它具有指向模板化类的私有成员指针。我对这类课程的设计有疑问。更准确地说,外层阶级是否应该被模板化。 因为,我正在初始化外部类的构造函数中的私有成员,我想,这样做是正确的。还有其他选择吗? 下面给出了一个类声明示例,欢迎所有建议:
#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;
};
答案 0 :(得分:1)
这取决于外部类的预期用法。您的代码表明OuterClass
可以与不同的模板类型一起使用,因此将它作为模板也是有意义的。实际上,这种模板参数转发很常见。
但是,如果您希望OuterClass
仅使用CFoo
和CBar
的特定模板专精,那么您只需指定所需的FOO_TYPE
和{{1}在相应成员的声明中。
答案 1 :(得分:1)
在您的类中,processFoo()和processBar()定义不正确。
它们不是您班级中的模板化函数,它们是专门为您的第一个和第二个模板参数键入的。
CFoo和CBar似乎是外部模板。
关于复制构造和赋值,你的类也失败了“3规则”,如果CBar的构造函数抛出(在这种情况下你的构造函数将抛出,你的析构函数永远不会被调用和m_pFoo),那么它不是异常安全的永远不会被删除)。