destructor莫名其妙出错

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

哪位帮助看看,谢谢了!  
   
   
  //matrix.h  
  #ifndef   matrix_h  
  #define   matrix_h  
  #include   <vector>  
  using   namespace   std;  
  template<class   t>  
  class   matrix  
  {  
  public:  
  matrix(unsigned   numberofrows,unsigned   numberofcolumns);  
  matrix(unsigned   numberofrows,unsigned   numberofcolumns,t   initvalue);  
  ~matrix();  
  vector<t>&   operator[](unsigned   index)const;  
  int   numberrows()const;  
  int   numbercolumns()const;  
  ostream&   print(ostream&);  
  private:  
  vector<vector<t>*>rows;  
  };  
  template<class   t>  
  matrix<t>::matrix(unsigned   numberofrows,unsigned   numberofcolumns)  
  :rows(numberofrows)  
  {  
  for(unsigned   i=0;i<numberofrows;i++)  
  {  
  rows[i]=new   vector<t>(numberofcolumns);  
  assert(rows[i]!=0);  
  }  
  }  
  template<class   t>  
  matrix<t>::matrix(unsigned   numberofrows,unsigned   numberofcolunms,t   init)  
  :rows(numberofrows)  
  {  
  for(unsigned   i=0;i<numberofrows;i++)  
  {  
  rows[i]=new   vector<t>(numberofcolunms,init);  
  assert(rows[i]!=0);  
  }  
  }  
   
  template<class   t>  
  matrix<t>::~matrix()  
  {  
  //if   this   destructor   is   not   exit,a   link   error   will   occurs  
  unsigned   max=rows.length();  
  vector<t>*   p;  
  for(int   i=0;i<max;i++)  
  {  
  p=rows[i];  
  rows[i]=0;  
  delete   p;  
  }  
  }  
  template<class   t>  
  int   matrix<t>::numbercolumns()const  
  {  
  return   rows[0]->length();  
  }  
  template<class   t>  
  int   matrix<t>::numberrows()const  
  {  
  return   rows.length();  
  }  
  template<class   t>  
  ostream&   matrix<t>::print(ostream&   os)  
  {  
  for(int   i=0;i<numberrows();i++)  
  os<<*(rows[i])<<endl;  
  return   os;  
  }  
  template<class   t>  
  ostream&   operator<<(ostream&   os,matrix<t>   mat)  
  {  
  return   mat.print(os);  
  }  
  #endif  
   
   
   
  //test.cpp  
   
  #include   "vector.h"  
  #include   "matrix.h"  
   
   
   
  void   main()  
  {  
       
      matrix<int>   mat0(5,8,0);  
     
  cout<<mat0<<endl;  
   
  }  
 

· 网友精彩回答:

发表者:fangrk

/*  
  你的程序没法通过编译  
  存放数组的数据没必要去使用指针,直接嵌套使用vector即可,这样的话也没有必要去写~matrix  
  你原本的~matrix是错误的,p=rows[i];rows[i]=0;delete   p;  
  相当于delete   (vector<t>*)0;没有任何效果  
  而且你应该知道,一旦涉及到指针,一般说来需要自己编写拷贝构造、赋予、析构  
  ostream&   operator<<(ostream&   os,matrix<t>   mat)  
  会导致调用缺省拷贝构造,缺省的不是正确的  
  */  
  #include   <vector>  
  #include   <iostream>  
  using   namespace   std;  
   
  template<class   t>  
  class   matrix  
  {  
  public:  
  matrix(size_t,size_t,const   t&   =t()   );  
  const   vector<t>&   operator[](size_t)   const;  
  int   numberrows()   const;  
  int   numbercolumns()   const;  
  t&   value(size_t,size_t);  
  const   t&   value(size_t,size_t)   const;  
  ostream&   print(ostream&)   const;  
  private:  
  vector<   vector<t>   >   data;  
  };  
  template<class   t>  
  matrix<t>::matrix(size_t   row,size_t   col,const   t&   def):data(row,vector<t>(col,def))  
  {}  
   
  template<class   t>  
  int   matrix<t>::numbercolumns()   const  
  {  
  return   data[0].size();  
  }  
  template<class   t>  
  int   matrix<t>::numberrows()   const  
  {  
  return   data.size();  
  }  
  template<class   t>  
  t&   matrix<t>::value(size_t   r,size_t   c)  
  {  
  return   data[r][c];  
  }  
  template<class   t>  
  const   t&   matrix<t>::value(size_t   r,size_t   c)   const  
  {  
  return   data[r][c];  
  }  
   
  template<class   t>  
  ostream&   matrix<t>::print(ostream&   os)   const  
  {  
  for(size_t   i=0;i<numberrows();++i){  
  for(size_t   j=0;j<numbercolumns();++j)  
  os<<data[i][j]<<\t;  
  os<<endl;  
  }  
  return   os;  
  }  
   
  template<class   t>  
  ostream&   operator<<(ostream&   os,const   matrix<t>&   mat)    
  {  
  return   mat.print(os);  
  }  
   
  int   main()  
  {  
       
      matrix<int>   mat0(5,8,3);  
      mat0.value(1,2)=8;  
     
      cout<<mat0<<endl;  
   
  }

.
处理 SSI 文件时出错
© 2006-2008 All Rights Reserved