如何使参数构造函数初始化通向方形矩阵的行和列?

时间:2014-04-21 13:32:24

标签: c++ matrix

我在制作参数化构造函数以初始化通向方阵的行和列时遇到问题。到目前为止,我已经将行和列初始化为2并使用new运算符动态分配内存。

这是我的代码,直到现在:

#include<iostream>
using namespace std;
class matrix {

    int row, column;
    matrix()
    {
        row = 2;
        column = 2;
    }
    int **array;

        array = new int*[row];
        for(int i=0;i<row;i++){
           array[i]=new int[column];
        }
};

我的问题是:

创建一个名为Matrix的类,其中包含“row”,“col”作为整数和一个整数 指针称为“数组”。在类中包含以下规范的功能。 使用new和delete运算符根据行和动态分配内存 列值。

i)默认构造函数将行和列初始化为2。

ii)一个参数构造函数,用于初始化通向一个
的行和列 方阵。

编辑:

我已经完成了代码,就在这里。这是对的:

 #include<iostream>
 #include<iomanip>
 using namespace std;

 //Create a class sqMatrix
 class sqMatrix
 {
    private:
       int **matrix;
       int dim;
    public:
       sqMatrix(int=5);
       sqMatrix(const sqMatrix&);
       ~sqMatrix();
       sqMatrix operator+(const sqMatrix&);
       sqMatrix operator-(const sqMatrix&);
       sqMatrix operator*(int);
       sqMatrix operator*(const sqMatrix&);
       sqMatrix operator^(const sqMatrix&);
       friend istream& operator>>(istream&,sqMatrix&);
       friend ostream& operator<<(ostream&,sqMatrix);
 };
 //Destructor
 sqMatrix::~sqMatrix()
 {
    for(int i=0;i<sqMatrix::dim;i++)
    {
       delete[] (sqMatrix::matrix)[i];
    }
 }
 //Parameterized constructor
 sqMatrix::sqMatrix(int dim)
 {
    sqMatrix::matrix=new int*[dim];
    for(int j=0;j<dim;j++)
    {
       sqMatrix::matrix[j]=new int[dim];
    }
    for(int i=0;i<dim;i++)
    {
       for(int j=0;j<dim;j++)
          sqMatrix::matrix[i][j]=0;
    }
    sqMatrix::dim=dim;
 }
 //Copy constructor
 sqMatrix::sqMatrix(const sqMatrix &mat)
 {
    sqMatrix::matrix=new int*[mat.dim];
    for(int j=0;j<mat.dim;j++)
    {
       sqMatrix::matrix[j]=new int[mat.dim];
    }
    for(int i=0;i<mat.dim;i++)
    {
       for(int j=0;j<mat.dim;j++)
          sqMatrix::matrix[i][j]=mat.matrix[i][j];
    }
    sqMatrix::dim=mat.dim;
 }
 //This function is used to perform the addition operation
 sqMatrix sqMatrix::operator+(const sqMatrix &mat)
 {
    sqMatrix tmp(mat.dim);
    for(int i=0;i<mat.dim;i++)
    {
       for(int j=0;j<mat.dim;j++)
       {
          tmp.matrix[i][j]=sqMatrix::matrix[i][j]+mat.matrix[i][j];
       }
    }
    return tmp;
 }
 //This function is used to perform the subtraction operation
 sqMatrix sqMatrix::operator-(const sqMatrix &mat)
 {
    sqMatrix tmp(mat.dim);
    for(int i=0;i<mat.dim;i++)
    {
       for(int j=0;j<mat.dim;j++)
       {
          tmp.matrix[i][j]=sqMatrix::matrix[i][j]-mat.matrix[i][j];
       }
    }
    return tmp;
 }
 //This function is used to perform the multiplication operation with a scalar value
 sqMatrix sqMatrix::operator*(int c)
 {
    sqMatrix tmp(sqMatrix::dim);
    for(int i=0;i<sqMatrix::dim;i++)
    {
       for(int j=0;j<sqMatrix::dim;j++)
          tmp.matrix[i][j] = sqMatrix::matrix[i][j] * c;
    }
    return tmp;
 }
 //This function is used to perform the multiplication operation between two square matrices
 sqMatrix sqMatrix::operator*(const sqMatrix &mat)
 {
    sqMatrix tmp(sqMatrix::dim);
    for(int i=0;i<sqMatrix::dim;i++)
    {
       for(int j=0;j<sqMatrix::dim;j++)
       {
          tmp.matrix[i][j]=0;
          for(int k=0;k<sqMatrix::dim;k++)
          {
             tmp.matrix[i][j]=tmp.matrix[i][j]+sqMatrix::matrix[i][k]*mat.matrix[k][j];
          }
       }
    }
    return tmp;
 }
 //This function is used to get transpose of a square matrix
 sqMatrix sqMatrix::operator^(const sqMatrix &mat)
 {
    for(int i=0;i<sqMatrix::dim;i++)
    {
       for(int j=0;j<sqMatrix::dim;j++)
          mat.matrix[i][j]=sqMatrix::matrix[j][i];
    }
    return mat;
 }
 //Overload >>(cin) operator which takes a square matrix as input
 istream& operator>>(istream &s,sqMatrix &mat)
 {
    cout<<"Enter "<<mat.dim*mat.dim<<" Elements :-"<<endl;
    for(int i=0;i<mat.dim;i++)
    {
       for(int j=0;j<mat.dim;j++)
       {
          cout<<"Element at row "<<i+1<<" col "<<j+1<<" : ";
          s>>mat.matrix[i][j];
       }
    }
 }
 //Overload <<(cout) operator which displays a square matrix
 ostream& operator<<(ostream &s,sqMatrix mat)
 {
    for(int i=0;i<mat.dim;i++)
    {
       for(int j=0;j<mat.dim;j++)
       {
          s<<setw(10);
          s<<mat.matrix[i][j];
       }
       cout<<"\n";
    }
 }
 int main()
 {
    int dim;

    cout<<"Enter dimension:";
    cin>>dim;

    sqMatrix test(dim);
    cin>>test;
    cout<<"Original Matrix:"<<endl;
    cout<<test;

    sqMatrix cpy(test);
    cout<<"Copy of the orginal Matrix:"<<endl;
    cout<<cpy;

    sqMatrix test1(dim);
    cout<<"Enter another matrix to add with the original:\n";
    cin>>test1;

    cout<<"Result of addition:\n";
    sqMatrix cpy1=test+test1;
    cout<<cpy1;

    sqMatrix test2(dim);
    cout<<"Enter another matrix to subtract with the original:\n";
    cin>>test2;

    cout<<"Result of subtraction:\n";
    sqMatrix cpy2=test-test2;
    cout<<cpy2;

    int sc;
    cout<<"Enter a scalar value:";
    cin>>sc;

    cout<<"multiplying with scalar value with the original: "<<endl<<endl;
    sqMatrix cpy3=test*sc;
    cout<<cpy3;

    sqMatrix test3(dim);
    cout<<"Enter another matrix to multiply with the original:\n";
    cin>>test3;

    cout<<"Result of multiplication:\n";
    sqMatrix cpy4=test*test3;
    cout<<cpy4;

    sqMatrix test4(dim);
    cout<<"\nTranspose of original matrix:\n";
    sqMatrix cpy5=test^test4;
    cout<<cpy5;

    return 0;
 }

1 个答案:

答案 0 :(得分:2)

我的改进建议:

  • 一般建议:

    如果您想使用某个班级的成员数据,最好使用this->而不是sqMatrix::。例如。使用

    this->dim = dim;
    

    而不是

    sqMatrix::dim = dim;
    

    第二种形式用于(1)你有一个类的静态成员(这是一个约定,而不是必需),或者(2)你需要使用基类的成员而不是成员具有相同名称的当前类(这是必需的)。

  • 您需要在析构函数中释放matrix

    //Destructor
    sqMatrix::~sqMatrix()
    {
       for(int i=0;i<sqMatrix::dim;i++)
       {
          // delete[] (sqMatrix::matrix)[i];
          // Simplify to:
          delete [] matrix[i];
       }
       delete [] matrix;  // This was a missing line
    }
    
  • 我建议不要使用operator^转置矩阵。您只需创建一个名为transpose的函数即可。语法

    sqMatrix cpy5=test.transpose();
    

    更具可读性
    sqMatrix cpy5=test^test4;
    

    当前实现也会因为你正在修改第二个参数,即使它是使用sqMatrix const&.传递的,我将建议

    sqMatrix sqMatrix::transpose() const
    {
       sqMatrix tmp(this->dim);
       for(int i=0;i<this->dim;i++)
       {
          for(int j=0;j<this->dim;j++)
             tmp.matrix[i][j]=this->matrix[j][i];
       }
       return tmp;
    }