这是我的老师要分配的任务,我想对operator +
进行矩阵重载,然后创建新矩阵并将总和放入此矩阵中,然后打印出来,但是什么也没打印,所以任何人都可以帮助我解决这个问题?
class matrix
{
private:
int* data;
int row, col;
public:
matrix();
matrix(int r, int c, int num[]);
friend ostream& operator << (ostream& out, matrix mat1);
friend istream& operator >> (istream& in, matrix& mat);
int getrow();
int getcol();
int getdata(int i);
int setrow(int r);
int setcol(int c);
int setdata(int num[]);
matrix operator+ (const matrix& mat2);
};
现在我编写此代码,它不会打印任何内容,有人可以帮助我解决此问题吗? 首先,我对数据进行设置和获取。
matrix::matrix(){
row=0;
col=0;
}
matrix::matrix(int r, int c, int num[])
{
row = r;
col = c;
data = new int[r*c];
for(int i=0; i < (r*c); i++)
data[i] = num[i];
}
matrix::getrow() { return row; }
matrix::getcol() { return col; }
matrix::setrow(int r) { row=r; }
matrix::setcol(int c) { col=c; }
matrix matrix::operator+ (const matrix& mat2)
{
matrix mat3;
for(int i=0; i < mat3.getrow() * mat3.getcol(); i++) {
mat3.data[i] = data[i] + mat2.data[i];
}
return mat3;
}
int main(){
int num2 [] = {1,2,3,4,5,6,7,8,8};
int num3 [] = {1,0,0,0,1,0,0,0,1};
matrix x;
matrix mat2(3, 3, num2);
matrix mat3(3, 3, num3);
matrix mat4;
mat4 = mat2 + mat3;
cou << mat4;
return 0;
}
答案 0 :(得分:1)
您没有设置mat3
的尺寸,因此getrow()
和getcol()
都返回0
,并且缓冲区太小,无法容纳放入其中的数据,因此您还会遭受缓冲区溢出的困扰。
添加一个仅接受维度而不初始化值的私有构造函数。
您的下一个问题是您没有复制/移动构造函数/ operator =(),因此对mat3
中main()
的分配没有很好的定义。
答案 1 :(得分:1)
以下是一些建议
尝试添加这样的构造函数重载方法:
matrix::matrix(int r, int c)
{
row = r;
col = c;
data = new int[r*c];
for (int i = 0; i < r*c; i++) {
data[i] = 0;
}
}
然后在operator+
重载函数中,使用以下方法启动mat3:
matrix mat3(mat2.getrow(), mat2.getcol());
=
运算符至关重要,因为您决定mat4 =
matrix matrix::operator= (const matrix& from_mat)
{
matrix to_mat(from_mat.getrow(), from_mat.getcol());
for (int i = 0; i < from_mat.getrow() * from_mat.getcol(); i++) {
to_mat.data[i] = from_mat.data[i];
}
return to_mat;
}
main
函数中,只需使用matrix mat4 = mat2 + mat3;
答案 2 :(得分:0)
您的帖子有很多错误。其他人指出了一些问题,这是IMO的完整列表:
operator+
,并且您未提供ostream& operator<< ( ostream&, matrix& )
的实现。同样没有理由显示矩阵的内容来对其进行修改,因此应该为ostream& operator<< ( ostream&, const matrix& )
(这也将消除对按值传递变量的需求)。~matrix()
)来处理释放,并且没有副本构造函数(matrix( const matrix& )
)。了解有关析构函数和内存管理的信息。matrix()
,但当前无法更新矩阵的大小或内容。如果默认构造函数创建的空矩阵以后无法更改,那又有什么意义呢?在这种情况下,您还应该定义data = nullptr
。 setrow, setcol
)的设置方法的作用尚不清楚;设置大小属性应该会影响内存分配(即data
),但目前不会。您还可以将这些方法声明为返回int
,但不返回任何内容。您应该删除这两种方法。不需要它们,您的实现目前是错误的。operator+
中,首先要检查的是输入的大小与当前矩阵的大小相同。第二件事是正确分配输出(使用matrix( row, col )
),这意味着需要附加的构造函数matrix(int r, int c)
(如其他答案所建议)。第三是将该方法声明为常量matrix operator+ ( const matrix& other ) const
。cou
应该是std::cout
。matrix x( -1, -5, NULL );
会怎样?