【发布时间】:2014-05-13 20:40:49
【问题描述】:
我有一个模板类 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()
【问题讨论】:
-
您可以使用 C++11 中的构造函数委托,或执行此初始化的成员函数(助手)。
-
假设您想对分配的内存做一些有用的事情,那么构造函数 2 将如何处理来自源类型的对象?
-
你打算在那些构造函数中复制
c2.val的元素吗? -
@dyp 是的,我也想要数据。但我没有在上面的帖子中提到它。但这不是问题。
-
您可以根据委托构造函数来实现构造函数 3。这是 C++11 中的新功能。
标签: c++ templates constructor