gpt4 book ai didi

c++ - 用模板复制构造函数替换默认复制构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:36 24 4
gpt4 key购买 nike

我有一个模板类 C。我想要这样一个模板复制构造函数,它将根据另一个类的大小调整数据数组的大小。

下面是一个简单的例子。它工作正常。但是,请注意 Constructor 2Constructor 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()

最佳答案

替换

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) {}

并且不需要第二个构造函数。

关于c++ - 用模板复制构造函数替换默认复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23641180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com