【求助】请帮我看看这是哪儿的问题(利用vector类派生matrix类的问题)

wendiyanglin 2020-05-28 12:18:47
此处为问题描述
Description
使用上一题定义的 Vector 类,定义它的派生类 Matrix,要求:Matrix类中应定义成员变量分别存储矩阵的行数和列数,然后以Vector类为基础实现二维数组(注意:不要直接定义二维数组实现),接着要求通过运算符重载的方法实现矩阵赋值“=”、矩阵加法“+”、矩阵减法“-”、矩阵乘法“*”,计算前请检查向量维度是否符合运算规则,若不符合请输出:“matrix size not match”(注意换行)。main函数可定义如下:
void main(){
int r1,r2,c1,c2;
cout<<"Input the numble of row and column of Matrix A:/n";
cin>>r1>>c1;
Matrix A(r1,c1);
cout<<"Input the elements of Matrix A:/n";
cin>>A;
cout<<"Input the numble of row and column of Matrix B:/n";
cin>>r2>>c2;
Matrix B(r2,c2);
cout<<"Input the elements of Matrix B:/n";
cin>>B;
Matrix C;
cout<<"A+B="<<endl;
C=A+B;
cout<<C<<endl;
cout<<"A-B="<<endl;
C=A-B;
cout<<C<<endl;
cout<<"A*B="<<endl;
C=A*B;
cout<<C<<endl;
}

Input

Output

Sample Input
2 3
1 2 3
4 5 6
2 3
7 8 9
10 11 12

Sample Output
Input the numble of row and column of Matrix A:
Input the elements of Matrix A:
Input the numble of row and column of Matrix B:
Input the elements of Matrix B:
A+B=
8 10 12
14 16 18
A-B=
-6 -6 -6
-6 -6 -6
A*B=
matrix size not match

以上是问题描述

以下是我的代码
#include<iostream>
using namespace std;
class integer
{
protected:
int n;
public:
integer(int);
};
integer::integer(int m)
{
n = m;
}
class vector:public integer
{
protected:
int* v;
public:
vector(int);
vector(const int*, int);
vector(const vector&);
~vector();
int& operator[](int i)const;
vector& operator =(const vector);
friend vector operator +(const vector&, const vector&);
friend vector operator -(const vector&, const vector&);
friend int operator *(const vector&, const vector&);
friend ostream& operator <<(ostream& output, const vector&);
friend istream& operator >>(istream& input, const vector&);
};
vector::vector(int m):integer(m)
{
v = new int[m];
for (int i = 0; i < m; i++)
v[i] = 0;
}
vector::vector(const int* m, int n):integer(n)
{
v = new int[n];
for (int i = 0; i < n; i++)
v[i] = m[i];
}
vector::vector(const vector& a):integer(a.n)
{
v = new int[a.n];
for (int i = 0; i < a.n; i++)
v[i] = a[i];
}
vector::~vector()
{
delete[] v;
n = 0;
}
int& vector::operator[](int i)const
{
return v[i];
}
vector& vector::operator =(const vector a)
{
for (int i = 0; i < a.n; i++)
v[i] = a[i];
return *this;
}
vector operator +(const vector& m, const vector& n)
{
vector t(m.n);
for (int i = 0; i < m.n; i++)
t[i] = m[i] + n[i];
return t;
}
vector operator -(const vector& m, const vector& n)
{
vector t(m.n);
for (int i = 0; i < m.n; i++)
t[i] = m[i] - n[i];
return t;
}
int operator *(const vector& m, const vector& n)
{
int t;
t = 0;
for (int i = 0; i < m.n; i++)
t += m[i] * n[i];
return t;
}
ostream& operator <<(ostream& output, const vector& m)
{
cout << "[";
for (int i = 0; i < m.n; i++)
{
cout << m[i];
if (i < m.n - 1) cout << ",";
}
cout << "]";
return output;
}
istream& operator >>(istream& input, const vector& m)
{
for (int i = 0; i < m.n; i++)
cin >> m[i];
return input;
}
class matrix:public vector
{
protected:
int** matr;
int m;
public:
matrix(int =0,int=0);
matrix(const matrix&);
int*& operator[](int i)const;
matrix& operator =(const matrix);
friend matrix operator +(const matrix&, const matrix&);
friend matrix operator -(const matrix&, const matrix&);
friend matrix operator *(const matrix&, const matrix&);
friend ostream& operator <<(ostream& output, const matrix&);
friend istream& operator >>(istream& input, const matrix&);
};
matrix::matrix(int a,int b):vector(b)
{
m = a;
matr = new int* [m];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
v[j] = 0;
matr[i] = &v[0];
delete[]v;
v = new int[n];
}
}
matrix::matrix(const matrix& p):vector(p.n)
{
m = p.m;
matr = new int*[m];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
v[j] = 0;
matr[i] = &v[0];
delete[]v;
v = new int[n];
}
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
matr[i][j] = p[i][j];
}
int*& matrix::operator[](int i)const
{
return matr[i];
}
matrix& matrix::operator =(const matrix p)
{
m = p.m;
n = p.n;
matr = new int* [m];
v = new int[n];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
v[j] = 0;
matr[i] = &v[0];
delete[]v;
v = new int[n];
}
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
matr[i][j] = p[i][j];
return *this;
}
matrix operator +(const matrix& x, const matrix& y)
{
matrix t(x.m, x.n);
for (int i = 0; i < x.m; i++)
for (int j = 0; j < x.n; j++)
t[i][j] = x[i][j]+y[i][j];
return t;
}
matrix operator -(const matrix& x, const matrix& y)
{
matrix t(x.m, x.n);
for (int i = 0; i < x.m; i++)
for (int j = 0; j < x.n; j++)
t[i][j] = x[i][j] - y[i][j];
return t;
}
matrix operator *(const matrix& x, const matrix& y)
{
if (x.n != x.m) {
cout << "matrix size not match";
abort();
}
int t;
int a, b;
a = 0; b = 0; t = 0;
matrix temp(x.m, y.n);
for(int i=0;i<x.m;i++)
{
a = i;
for (int j = 0; j < y.n; j++)
{
b = j;
for (int k = 0; k < x.n; k++)
t += x[i][k] * y[k][j];
temp[a] = t;
t = 0;
}
}
return temp;
}
ostream& operator <<(ostream& output, const matrix& p)
{
for (int i = 0; i < p.m; i++)
{
for (int j = 0; j < p.n; j++)
cout << p[i][j];
cout << endl;
}
return output;
}
istream& operator >>(istream& input, const matrix& p)
{
for (int i = 0; i < p.m; i++)
for (int j = 0; j < p.n; j++)
cin>> p[i][j];
return input;
}
int main() {
int r1, r2, c1, c2;
cout << "Input the numble of row and column of Matrix A:/n";
cin >> r1 >> c1;
matrix A(r1, c1);
cout << "Input the elements of Matrix A:/n";
cin >> A;
cout << "Input the numble of row and column of Matrix B:/n";
cin >> r2 >> c2;
matrix B(r2, c2);
cout << "Input the elements of Matrix B:/n";
cin >> B;
matrix C;
cout << "A+B=" << endl;
C = A + B;
cout << C << endl;
cout << "A-B=" << endl;
C = A - B;
cout << C << endl;
cout << "A*B=" << endl;
C = A * B;
cout << C << endl;
}






[b]此处是一次运行的结果



各位请问到底是哪儿出了问题呢?我应该怎么修改代码呢?实在希望可以得到大家的帮助,谢谢!

...全文
84 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wendiyanglin 2020-05-28
  • 打赏
  • 举报
回复
自己感觉应该是重载插入和提取运算符出了问题,但是不知道该怎么修改
棉猴 2020-05-28
  • 打赏
  • 举报
回复
matrix::matrix(int a, int b) :vector(b)
{
	m = a;
	matr = new int*[m];
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
			v[j] = 0;
		matr[i] = &v[0];
		delete[]v;//---问题出在这行代码,每次循环都把之前申请的内存释放掉,在后面这些内存就被其它数据占用了-----------
		v = new int[n];
	}
}
wendiyanglin 2020-05-28
  • 打赏
  • 举报
回复
这里是temp[a][b],应该是复制的时候搞错了。
棉猴 2020-05-28
  • 打赏
  • 举报
回复
matrix operator *(const matrix& x, const matrix& y)
{
    if (x.n != x.m) {
        cout << "matrix size not match";
        abort();
}
    int t;
    int a, b;
    a = 0; b = 0; t = 0;
    matrix temp(x.m, y.n);
    for(int i=0;i<x.m;i++)
    {
        a = i;
        for (int j = 0; j < y.n; j++)
        {
            b = j;
            for (int k = 0; k < x.n; k++)
                t += x[i][k] * y[k][j];
            temp[a]<strong> = t;//---------<strong>是个什么情况??
            t = 0;
        }
    }
    return temp;
}
wendiyanglin 2020-05-28
  • 打赏
  • 举报
回复
救救孩子

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧