#include<iostream> using namespace std; class Matrix{ int **p; public: ~Matrix(){ delete[] p; } Matrix(){ for(int i=0;i<3;i++){ p[i]=new int[3]; } } int* operator[](int i){ return p[i]; } int& getElement(int i,int j){ return p[i][j]; } void setMatrix(){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ cin>>p[i][j]; } } } void printMatrix(){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ cout<<this->getElement(i,j)<<" "; } cout<<endl; } } Matrix mutipleMatrix(Matrix b){ Matrix *t=new Matrix(); int sum=0; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ sum=0; for(int k=0;k<3;k++){ sum+=this->getElement(i,k)*b.getElement(k,j); } t->getElement(i,j)=sum; } } return *t; } }; int main() { Matrix a,b,c; a.setMatrix(); b.setMatrix(); c=a.mutipleMatrix(b); c.printMatrix(); return 0; } 错在哪里
时间: 2024-04-08 09:29:04 浏览: 93
在这段代码中,问题在于在Matrix类的构造函数中,没有为指针数组p分内存。这会导致未定义为,可能会导致程序崩溃或生不可预测的结果。
要修复这问题,你需要在函数中为指针p分配内存。可以使用new`关键字为每个指针分配内存,然后再为每个指针向的数组分配内存修正后的构造函数代码如下所:
```cpp
Matrix(){
p = new int*[3];
(int i=0; i<3; i++){
p[i] = new int[3];
}
}
```
请注意,还需要修改析构函数,以便正确释放为p分配的内存。由于p是一个指针数组,需要使用循环释放每个指针指向的数组内存,然后再释放指针数组本身的内存。修正后的析构函数代码如下所示:
```cpp
~Matrix(){
for(int i=0; i<3; i++){
delete[] p[i];
}
delete[] p;
}
```
修复了这两个问题后,代码应该能够正常运行。希望这次解释更加清晰明了。如果还有其他问题,请随时提问!
相关问题
6-1 矩阵类模板 分数 40 作者 J.Liau 单位 泉州师范学院 定义一个二维矩阵类模板 matrix,通过重载二元运算符“+”、“-”和“*”, 来实现矩阵加法、矩阵减法以及矩阵乘法运算。 完成数组所要求的操作。(注:数组中元素个数不超过100) 程序结构如下: #include<iostream> using namespace std; template<typename T> class matrix { public: matrix(int a, int b);
以下是矩阵类模板 matrix 的完整实现代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
template<typename T>
class matrix {
public:
matrix(int a, int b);
matrix(const matrix<T>& other);
~matrix();
matrix<T>& operator=(const matrix<T>& other);
matrix<T> operator+(const matrix<T>& other) const;
matrix<T> operator-(const matrix<T>& other) const;
matrix<T> operator*(const matrix<T>& other) const;
T& operator()(int i, int j);
const T& operator()(int i, int j) const;
int rows() const;
int cols() const;
private:
int m_rows;
int m_cols;
T* m_data;
};
template<typename T>
matrix<T>::matrix(int a, int b) : m_rows(a), m_cols(b), m_data(new T[a * b]) {}
template<typename T>
matrix<T>::matrix(const matrix<T>& other) : m_rows(other.m_rows), m_cols(other.m_cols), m_data(new T[other.m_rows * other.m_cols]) {
memcpy(m_data, other.m_data, sizeof(T) * m_rows * m_cols);
}
template<typename T>
matrix<T>::~matrix() {
delete[] m_data;
}
template<typename T>
matrix<T>& matrix<T>::operator=(const matrix<T>& other) {
if (this != &other) {
delete[] m_data;
m_rows = other.m_rows;
m_cols = other.m_cols;
m_data = new T[other.m_rows * other.m_cols];
memcpy(m_data, other.m_data, sizeof(T) * m_rows * m_cols);
}
return *this;
}
template<typename T>
matrix<T> matrix<T>::operator+(const matrix<T>& other) const {
if (m_rows != other.m_rows || m_cols != other.m_cols) {
throw "Matrices must have the same dimensions.";
}
matrix<T> res(m_rows, m_cols);
for (int i = 0; i < m_rows; i++) {
for (int j = 0; j < m_cols; j++) {
res(i, j) = (*this)(i, j) + other(i, j);
}
}
return res;
}
template<typename T>
matrix<T> matrix<T>::operator-(const matrix<T>& other) const {
if (m_rows != other.m_rows || m_cols != other.m_cols) {
throw "Matrices must have the same dimensions.";
}
matrix<T> res(m_rows, m_cols);
for (int i = 0; i < m_rows; i++) {
for (int j = 0; j < m_cols; j++) {
res(i, j) = (*this)(i, j) - other(i, j);
}
}
return res;
}
template<typename T>
matrix<T> matrix<T>::operator*(const matrix<T>& other) const {
if (m_cols != other.m_rows) {
throw "Number of columns in first matrix must match number of rows in second matrix.";
}
matrix<T> res(m_rows, other.m_cols);
for (int i = 0; i < m_rows; i++) {
for (int j = 0; j < other.m_cols; j++) {
T sum = 0;
for (int k = 0; k < m_cols; k++) {
sum += (*this)(i, k) * other(k, j);
}
res(i, j) = sum;
}
}
return res;
}
template<typename T>
T& matrix<T>::operator()(int i, int j) {
if (i < 0 || i >= m_rows || j < 0 || j >= m_cols) {
throw "Index out of range.";
}
return m_data[i * m_cols + j];
}
template<typename T>
const T& matrix<T>::operator()(int i, int j) const {
if (i < 0 || i >= m_rows || j < 0 || j >= m_cols) {
throw "Index out of range.";
}
return m_data[i * m_cols + j];
}
template<typename T>
int matrix<T>::rows() const {
return m_rows;
}
template<typename T>
int matrix<T>::cols() const {
return m_cols;
}
```
该矩阵类模板支持以下操作:
- 构造函数 `matrix(int a, int b)`:创建一个行数为 `a`,列数为 `b` 的矩阵,所有元素的初值为默认值(例如,0)。
- 拷贝构造函数 `matrix(const matrix<T>& other)`:创建一个与 `other` 完全相同的矩阵。
- 析构函数 `~matrix()`:释放矩阵占用的内存。
- 赋值运算符 `matrix<T>& operator=(const matrix<T>& other)`:将本矩阵赋值为 `other`。
- 加法运算符 `matrix<T> operator+(const matrix<T>& other) const`:返回本矩阵与 `other` 相加的结果。要求本矩阵与 `other` 的行列数相同。
- 减法运算符 `matrix<T> operator-(const matrix<T>& other) const`:返回本矩阵与 `other` 相减的结果。要求本矩阵与 `other` 的行列数相同。
- 乘法运算符 `matrix<T> operator*(const matrix<T>& other) const`:返回本矩阵与 `other` 相乘的结果。要求本矩阵的列数等于 `other` 的行数。
- 括号运算符 `T& operator()(int i, int j)` 和 `const T& operator()(int i, int j) const`:分别用于访问矩阵中第 `i` 行、第 `j` 列的元素。若下标越界,则抛出异常。
- `int rows() const` 和 `int cols() const`:分别返回矩阵的行数和列数。
使用时,需要先定义一个矩阵类模板实例,例如:
```cpp
matrix<int> m1(2, 3);
matrix<int> m2(3, 2);
```
然后就可以使用矩阵类模板中定义的各种运算符进行矩阵计算。例如:
```cpp
matrix<int> m3 = m1 + m2;
matrix<int> m4 = m1 - m2;
matrix<int> m5 = m1 * m2;
```
#include<iostream> using namespace std; class Matrix { private: int* p; int rows, cols; public: Matrix(int r, int c) { rows = r; cols = c; p = new int[rows * cols]; } Matrix(Matrix& b) { rows = b.rows; cols = b.cols; p = new int[rows * cols]; for (int i = 0; i < rows * cols; i++) { p[i] = b.p[i]; } } void input() { cout << "请输入数组值:" << endl; for (int i = 0; i < rows * cols; i++) { cin >> p[i]; } } Matrix operator+(Matrix& b) { Matrix c(rows, cols); for (int i = 0; i < rows * cols; i++) { c.p[i] = p[i] + b.p[i]; } return c; } Matrix operator=(Matrix& b) { rows = b.rows; cols = b.cols; p = new int[rows * cols]; for (int i = 0; i < rows * cols; i++) { p[i] = b.p[i]; } } void show() { cout << "数组值为:" << endl; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << p[i * cols + j] << " "; } cout << endl; } } ~Matrix() { delete[]p; } }; int main() { int r, c; cout << "请输入矩阵行数和列数:" << endl; cin >> r >> c; Matrix A(r, c); cout << "请输入矩阵A的值:" << endl; A.input(); A.show(); Matrix B(A); cout << "复制构造函数测试:" << endl; B.show(); Matrix C(r, c); C = A + B; cout << "加法运算符测试:" << endl; A.show(); Matrix D(r, c); D = A; cout << "赋值运算符测试:" << endl; D.show(); return 0; }请问这段代码为什么会报错
这段代码报错的原因是在 Matrix 类中的赋值运算符重载函数中没有返回值。应该将赋值运算符重载函数的返回值类型设置为 Matrix 类型,并在函数体中添加 return *this; 语句,将当前对象的引用返回。修改后的代码如下:
```cpp
Matrix& operator=(Matrix& b) {
rows = b.rows;
cols = b.cols;
p = new int[rows * cols];
for (int i = 0; i < rows * cols; i++) {
p[i] = b.p[i];
}
return *this;
}
```
阅读全文