提问人:BS e-Learning 提问时间:3/29/2022 更新时间:3/29/2022 访问量:192
在 C++ 中添加矩阵
Addition of Matrix in C++
问:
以下代码给了我错误的输出。实际上,它不是在做求和,它实际上是将第二个对象复制到 M3 对象,而不是计算求和。我想我在 + 运算符重载中有一些逻辑错误。有人有什么想法或任何其他建议吗?它显示实际在复制构造函数 cout<data[r][c]<<“\t”; 中调用的输出。但是当我使用 M3.displayData() 时它没有显示输出。 #include
#include <string.h>
using namespace std;
class Matrix{
private:
int noOfRows;
int noOfColumns;
int **data;
public:
Matrix(int noOfRows, int noOfColumns);
void displayData();
~Matrix();
Matrix (const Matrix &ref);
Matrix operator + (Matrix m);
Matrix& operator=(Matrix m) {
std::swap(m.noOfRows, noOfRows);
std::swap(m.noOfColumns, noOfColumns);
std::swap(m.data, data);
return *this; }
};
Matrix::Matrix(int inr=0, int inc=0){
noOfRows=inr; noOfColumns=inc;
data=new int*[noOfColumns];
for(int i=0;i<noOfRows;i++)
data[i]=new int[noOfColumns];
int d;
for(int r=0;r<noOfRows;r++){
for(int c=0;c<noOfColumns;c++){
cout<<"Enter ...";cin>>d;
data[r][c]=d;
}
cout<<endl;
}
}
Matrix::Matrix (const Matrix &ref){
this->data=new int*[ref.noOfColumns];
for(int i=0;i<ref.noOfRows;i++)
this->data[i]=new int[ref.noOfRows];
for(int r=0;r<ref.noOfRows;r++){
for(int c=0;c<ref.noOfColumns;c++){
this->data[r][c]=ref.data[r][c];
cout<<this->data[r][c]<<"\t";
}
cout<<endl;
}
}
Matrix Matrix::operator + (Matrix m){
Matrix ms(m.noOfRows,m.noOfColumns);
ms=0;
for (int i=0; i<m.noOfRows; i++)
for (int j=0; j<m.noOfColumns; j++){
ms.data[i][j] = data[i][j]+m.data[i][j];
return ms;
}
}
void Matrix::displayData(){
for(int r=0;r<noOfRows;r++){
for(int c=0;c<noOfColumns;c++)
cout<<data[r][c]<<"\t";
cout<<endl;
}
}
Matrix::~Matrix(){
delete[] data;
}
int main(){
Matrix M1(2,2),M2(2,2);
cout<<"\n Matrix A="<<endl;
M1.displayData();
cout<<"\n Matrix B="<<endl;
M2.displayData();
cout<<"\n Sum of Matrix="<<endl;
Matrix M3=M1+M2;
M3.displayData();
return 0;
}
答:
代码至少存在四个问题:
复制构造函数无法复制 和 值。
Matrix
noOfRows
noOfColumns
错误地分配了行指针,方法是使用 as 行数。
noOfColumns
在 中,您正在返回循环内部,而您应该在循环完成后返回它。
Matrix operator +
Matrix
for
析构函数无法处理所有行和列数据。
delete[]
要解决前两个问题,由于默认构造函数和复制构造函数之间有很多通用代码,因此可以创建一个成员函数来分配内存:Matrix
Allocate
class Matrix
{
private:
void Allocate();
//... other members
public:
Matrix operator + (const Matrix& m);
// other members...
};
Matrix::Matrix(int inr=0, int inc=0) : noOfRows(inr), noOfColumns(inc)
{
Allocate();
// Input code removed...
}
Matrix::Matrix (const Matrix &ref) : noOfRows(ref.noOfRows), noOfColumns(ref.noOfColumns)
{
Allocate();
for(int r=0; r < ref.noOfRows; r++)
{
for(int c=0; c < ref.noOfColumns; c++)
data[r][c] = ref.data[r][c];
}
}
void Matrix::Allocate()
{
data=new int*[noOfRows];
for(int i=0;i < noOfRows; i++)
data[i]=new int[noOfColumns]();
}
对于 ,您应该传递 by const 引用,而不是 by 值(这是对修复过早返回的错误之外的):operator +
Matrix
Matrix
Matrix Matrix::operator + (const Matrix& m)
{
Matrix ms(m.noOfRows,m.noOfColumns);
for (int i=0; i<m.noOfRows; i++)
{
for (int j=0; j<m.noOfColumns; j++)
ms.data[i][j] = data[i][j]+m.data[i][j];
}
return ms;
}
最后一个问题(析构函数)仅删除行指针,但不删除为每行分配的数据。修复如下:
Matrix::~Matrix()
{
for (int i = 0; i < noOfRows; ++i)
delete[] data[i];
delete [] data;
}
其他问题:
- 在操作员之间留出更多空间。您当前的代码将所有内容压缩在一起,使其难以阅读。例如:
for(int c=0;c<ref.noOfColumns;c++)
可能是:for (int c=0; c < ref.noOfColumns; c++)
过度和不必要地使用 .
this->
如果存在,那么也存在是有意义的。对于后者,只需 ,即可实现 ,制作一行或两行代码。
Matrix::operator +
Matrix::operator +=
operator +
operator +=
operator +
这个答案说明了一种可能更好的内存分配方法,因为只进行了两次分配,分配的内存是连续的,并且会发生更少的内存碎片。
评论
Matrix
Matrix
Matrix
Matrix
Matrix
评论
Matrix
std::swap
std::swap
std::swap