简单的用户定义向量模板示例
问题描述:
考虑下面的代码:简单的用户定义向量模板示例
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];
}
PS。完整的代码在这里:http://codepad.org/e0RozCrF为什么在vecTor()中再次初始化,因为我们已经在vecTor(int s = 0)ctor中完成了它。 void vecTorset(T * a,int s)中也不需要初始化。为什么? – Burt 2011-05-22 09:08:50
你还没有“已经完成”,当你创建一个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
这意味着打电话给一个转化。 ctor独立于另一个转换器的调用,至少在这种情况下。 – Burt 2011-05-22 14:34:08