用模板复制构造函数替换默认的复制构造函数

时间:2014-05-13 20:40:49

标签: 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()

2 个答案:

答案 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; 
    }