我有一个模板类C.我想要这样一个模板复制构造函数,它将根据另一个类的大小调整数据数组的大小。
以下是一个简单的例子。它工作正常。但是,请注意Constructor 2
和Constructor 3
是如此相似,我想知道是否可以将它们合并为一个?
此外,如果我简单地删除Constructor 3
,则C<int> c3( c1 )
不会调用Constructor 2
,而是会调用编译器添加的默认复制构造函数。这将导致内存未正确分配。
template<typename T>
class C
{
public:
T* val;
int size;
public:
C( int s = 0 ) {
cout << "Constructor 1" << endl;
size = s;
val = ( size ) ? new T[size] : nullptr;
}
template<class T2>
C( const C<T2>& c2 ) {
cout << "Constructor 2" << endl;
size = c2.size;
val = ( size ) ? new T[size] : nullptr;
}
C( const C<T>& c2 ) {
cout << "Constructor 3" << endl;
size = c2.size;
val = ( size ) ? new T[size] : nullptr;
}
~C() {
cout << "~C()" << endl;
delete[] val;
val = nullptr;
}
};
int main(void)
{
C<int> c1( 5 );
C<float> c2( c1 );
C<int> c3( c1 );
return 0;
}
输出上述功能:
Constructor 1
Constructor 2
Constructor 3
~C()
~C()
~C()
答案 0 :(得分:1)
替换
template<class T2>
C( const C<T2>& c2 ) {
cout << "Constructor 2" << endl;
size = c2.size;
val = ( size ) ? new T[size] : nullptr;
}
C( const C<T>& c2 ) {
cout << "Constructor 3" << endl;
size = c2.size;
val = ( size ) ? new T[size] : nullptr;
}
通过
template<class T2>
C( const C<T2>& c2, int dummy) {
cout << "Constructor 2" << endl;
size = c2.size;
val = ( size ) ? new T[size] : nullptr;
}
template<class T2>
C( const C<T2>& c2 ) : C(c2, 0) {}
C( const C<T>& c2 ) : C(c2, 0) {}
<强>更新强>
你可以使用:
C( int s = 0 ) {
cout << "Constructor 1" << endl;
size = s;
val = ( size ) ? new T[size] : nullptr;
}
template<class T2>
C( const C<T2>& c2 ) : C(c2.size) {}
C( const C<T>& c2 ) : C(c2.size) {}
并且不需要第二个构造函数。
答案 1 :(得分:0)
有人想用C ++ 11委托构造函数实现它。然而,由于模板参数对于类或构造函数的模糊性,这不可能以直接的方式进行。作为一种解决方法,可以将公共代码分解为辅助函数。
类似的东西:
template<class T2>
C( const C<T2>& c2 ) {
Copy<T2>(c2);
}
C( const C<T>& c2 ) {
Copy<T>(c2);
}
private:
template<class T2>
void Copy( const C<T2>& c2 ) {
cout << "Constructor 2" << endl;
size = c2.size;
val = ( size ) ? new T[size] : nullptr;
}