如何使参数构造函数初始化导致平方矩阵的行和列

how to make a Parameter Constructor to initialize the row and column leading to a Square Matrix?

本文关键字:方矩阵 参数 何使 构造函数 初始化      更新时间:2023-10-16

我在制作一个参数化构造函数来初始化导致平方矩阵的行和列时遇到了问题。到目前为止,我已经将行和列初始化为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;
 }

我的改进建议:

  • 一般建议:

    当您想要使用类的成员数据时,最好使用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;
    }