您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 这个简单的矩阵类C++为什么会报错?

这个简单的矩阵类C++为什么会报错?

来源:网络整理     时间:2016/7/5 12:58:08     关键词:

关于网友提出的“ 这个简单的矩阵类C++为什么会报错?”问题疑问,本网通过在网上对“ 这个简单的矩阵类C++为什么会报错?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 这个简单的矩阵类C++为什么会报错?
描述:

#include
using namespace std;
class matrix
{
public:
matrix(int,int);
void set_m();
matrix operator~();
void display();
matrix(matrix&);
~matrix(){ delete m; };
private:
int lin,col;
int **m;
}
matrix::matrix(int a,int b)
{
lin=a;
col=b;
m=new int*[lin];
for(int i=0;i<>
m[i]=new int[col];
}
matrix::matrix(matrix& mp)
{
lin=mp.lin;
col=mp.col;
m=new int*[lin];
for(int i=0;i<>
m[i]=new int[col];
}
void matrix::set_m()
{
cout<<"please input the matrix:\n";
for(int i=0;i<>
for(int j=0;j<>
cin>>m[i][j];
}
matrix matrix::operator~()
{
matrix C(col,lin);
for(int i=0;i<>
for(int j=0;j<>
C.m[j][i]=m[i][j];
return C;
}
void matrix::display()
{
for(int i=0;i<>
{
for(int j=0;j<>
cout<<>
cout<<>
}
}
int main()
{
int al,ac;
cout<<"please input the first matrix's lin and col:\n";
cin>>al>>ac;
matrix A(al,ac);
A.set_m();
(~A).display();
cout<<>
return 0;
}
自己编的一个矩阵类,求转置的,编译报错说“constructors not allowed a return type”,但这个构造函数似乎没有返回类型啊,难道是动态分配内存的问题?


解决方案1:

在类定义或者申明时,结束的地方忘了加个'; '

解决方案2:


   // Miscellaneous -methods
   void Null (const size_t& row, const size_t& col) _NO_THROW;
   void Null () _NO_THROW;
   void Unit (const size_t& row) _NO_THROW;
   void Unit () _NO_THROW;
   void SetSize (size_t row, size_t col) _NO_THROW;
   // Utility methods
   matrixT Solve (const matrixT& v) const _THROW_MATRIX_ERROR;
   matrixT Adj () _THROW_MATRIX_ERROR;
   matrixT Inv () _THROW_MATRIX_ERROR;
   T Det () const _THROW_MATRIX_ERROR;
   T Norm () _NO_THROW;
   T Cofact (size_t row, size_t col) _THROW_MATRIX_ERROR;
   T Cond () _NO_THROW;
   // Type of matrices
   bool IsSquare () _NO_THROW { return (_m->Row == _m->Col); } 
   bool IsSingular () _NO_THROW;
   bool IsDiagonal () _NO_THROW;
   bool IsScalar () _NO_THROW;
   bool IsUnit () _NO_THROW;
   bool IsNull () _NO_THROW;
   bool IsSymmetric () _NO_THROW;
   bool IsSkewSymmetric () _NO_THROW;
   bool IsUpperTriangular () _NO_THROW;
   bool IsLowerTriangular () _NO_THROW;
private:
    struct base_mat
    {
T **Val;
size_t Row, Col, RowSiz, ColSiz;
int Refcnt;
base_mat (size_t row, size_t col, T** v)
{
    Row = row; RowSiz = row;
    Col = col; ColSiz = col;
    Refcnt = 1;
    Val = new T* [row];
    size_t rowlen = col * sizeof(T);
    for (size_t i=0; i < row; i++)
    {
Val[i] = new T [col];
if (v) memcpy( Val[i], v[i], rowlen);
    }
}
~base_mat ()
{
    for (size_t i=0; i < RowSiz; i++)
delete [] Val[i];
    delete [] Val;
}
    };
    base_mat *_m;
    void clone ();
    void realloc (size_t row, size_t col);
    int pivot (size_t row);
};
#if defined(_MSC_VER) && _MSC_VER <= 1020
#  undef  _NO_THROW               // MSVC++ 4.0/4.2 does not support 
#  undef  _THROW_MATRIX_ERROR     // exception specification in definition
#  define _NO_THROW
#  define _THROW_MATRIX_ERROR
#endif
// constructor
MAT_TEMPLATE inline
matrixT::matrix (size_t row, size_t col)
{
  _m = new base_mat( row, col, 0);
}
// copy constructor
MAT_TEMPLATE inline
matrixT::matrix (const matrixT& m)
{
    _m = m._m;
    _m->Refcnt++;
}
// Internal copy constructor
MAT_TEMPLATE inline void
matrixT::clone ()
{
    _m->Refcnt--;
    _m = new base_mat( _m->Row, _m->Col, _m->Val);
}
// destructor
MAT_TEMPLATE inline
matrixT::~matrix ()
{
   if (--_m->Refcnt == 0) delete _m;
}
// assignment operator
MAT_TEMPLATE inline matrixT&
matrixT::operator = (const matrixT& m) _NO_THROW
{
    m._m->Refcnt++;
    if (--_m->Refcnt == 0) delete _m;
    _m = m._m;
    return *this;
}
//  reallocation method
MAT_TEMPLATE inline void 
matrixT::realloc (size_t row, size_t col)
{
   if (row == _m->RowSiz && col == _m->ColSiz)
   {
      _m->Row = _m->RowSiz;
      _m->Col = _m->ColSiz;
      return;
   }
   base_mat *m1 = new base_mat( row, col, NULL);
   size_t colSize = min(_m->Col,col) * sizeof(T);
   size_t minRow = min(_m->Row,row);
   for (size_t i=0; i < minRow; i++)
      memcpy( m1->Val[i], _m->Val[i], colSize);
   if (--_m->Refcnt == 0) 
       delete _m;
   _m = m1;
   return;
}
// public method for resizing matrix
MAT_TEMPLATE inline void
matrixT::SetSize (size_t row, size_t col) _NO_THROW
{
   size_t i,j;
   size_t oldRow = _m->Row;
   size_t oldCol = _m->Col;
   if (row != _m->RowSiz || col != _m->ColSiz)
      realloc( row, col);
   for (i=oldRow; i < row; i++)
      for (j=0; j < col; j++)
 _m->Val[i][j] = T(0);
   for (i=0; i < row; i++)                      
      for (j=oldCol; j < col; j++)
 _m->Val[i][j] = T(0);
   return;
}
// subscript operator to get/set individual elements
MAT_TEMPLATE inline T&
matrixT::operator () (size_t row, size_t col) _THROW_MATRIX_ERROR
{
   if (row >= _m->Row || col >= _m->Col)
      REPORT_ERROR( "matrixT::operator(): Index out of range!");
   if (_m->Refcnt > 1) clone();
   return _m->Val[row][col];
}
// subscript operator to get/set individual elements
MAT_TEMPLATE inline T
matrixT::operator () (size_t row, size_t col) const _THROW_MATRIX_ERROR
{
   if (row >= _m->Row || col >= _m->Col)
      REPORT_ERROR( "matrixT::operator(): Index out of range!");
   return _m->Val[row][col];
}
// input stream function
MAT_TEMPLATE inline istream&
operator >> (istream& istrm, matrixT& m)
{
   for (size_t i=0; i < m.RowNo(); i++)
      for (size_t j=0; j < m.ColNo(); j++)
      {
         T x;
         istrm >> x;
         m(i,j) = x;
      }
   return istrm;
}
// output stream function
MAT_TEMPLATE inline ostream&
operator << (ostream& ostrm, const matrixT& m)
{
   for (size_t i=0; i < m.RowNo(); i++)
   {
      for (size_t j=0; j < m.ColNo(); j++)
      {
         T x = m(i,j);
         ostrm << x << '\t';
      }
      ostrm << endl;
   }
   return ostrm;
}
// logical equal-to operator
MAT_TEMPLATE inline bool
operator == (const matrixT& m1, const matrixT& m2) _NO_THROW
{
   if (m1.RowNo() != m2.RowNo() || m1.ColNo() != m2.ColNo())
      return false;
   for (size_t i=0; i < m1.RowNo(); i++)
      for (size_t j=0; j < m1.ColNo(); j++)
      if (m1(i,j) != m2(i,j))
         return false;
   return true;
}

以上介绍了“ 这个简单的矩阵类C++为什么会报错?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2297910.html

相关图片

相关文章