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

标签 c++ templates constructor

我有一个模板类 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/

相关文章:

java - 构造函数和方法中数组的内容不同

c++ - Linux 安装库 (ICU) 问题

c++ - 我可以对(非成员)函数使用部分模板特化吗?

c++ - 混合代码 - 函数成员指针

templates - 如何更改 phpstorm 自定义构造函数模板?

c++ - 为什么这个简单的模板代码会出错?

c# - 带参数的静态资源构造器

c++ - 构造函数中冒号后的变量

c++ - OpenCV 3.0 错误包含 ocl.hpp

c++ - 用于多行字符串的 ECMAScript 正则表达式