简单的用户定义向量模板示例

问题描述:

考虑下面的代码:简单的用户定义向量模板示例

template<typename T> 
class vecTor 
{ 
int size; 
T *v; 
    public: 
vecTor(int s=0): size(s), 
    v(new T[size]) // conv. ctor [1] 
    { 
     for(int i=0; i<size; i++) 
      v[i]=0; 
    } 

vecTor(T *x,int s) // [2] this conv. ctor produces seg. fault if called 
{ 
    size=s; 
    for(int i=0; i<size; i++) 
    v[i] = x[i]; 
} 

void vecTorset(T *a,int s) // this method works fine 
{       // instead of [2] 
    size=s; 
    for(int i=0; i<size; i++) 
     v[i] = a[i]; 
} 

~vecTor() 
{ 
    delete [] v; 
} 

void printvec() const; 
}; 

    template<typename T> 
    void vecTor<T>::printvec() const 
    { 
    cout<<"Vector is:\n"; 
     for(int i=0; i<size; i++) 
     cout<< v[i] <<" "; 
     cout<<"\n"; 
    } 

int main() 
{ 
    int a[3]= {3,5,7}; 

    vecTor<int> v1(3); 

    v1=vecTor<int>(a,3); // this call produces seg. fault 

    //v1.vecTorset(a,3); //this call works fine 

    v1.printvec(); 

    return 0; 

}

如果我称第二转换构造函数

 v1=vecTor<int>(a,3); 

我在codepad.org得到分割故障;它在mingw上崩溃。可能是什么问题呢?

您还没有初始化T*

vecTor(T *x,int s) : size(s), v(new T[size]) 
{ 
    for(int i=0; i<size; i++) 
    v[i] = x[i]; 
} 
+0

PS。完整的代码在这里:http://codepad.org/e0RozCrF为什么在vecTor()中再次初始化,因为我们已经在vecTor(int s = 0)ctor中完成了它。 void vecTorset(T * a,int s)中也不需要初始化。为什么? – Burt 2011-05-22 09:08:50

+0

你还没有“已经完成”,当你创建一个vecTor的实例时,只有一个构造函数被调用。如果你使用'vecTor(T * x,int s)'构造'vecTor(int s)''永远不会被调用。 'void vecTorset(T * a,int s)'不是一个构造函数,大概你是先用'vecTor(int s)'构造的,这就是它的工作原理。 – briantyler 2011-05-22 09:29:59

+0

这意味着打电话给一个转化。 ctor独立于另一个转换器的调用,至少在这种情况下。 – Burt 2011-05-22 14:34:08