1

我试图重新定义 + 运算符,它是对 2 个矩阵求和并在 C++ 中返回求和矩阵。但不知何故,它一直显示为 0。我错过了什么?这是我的代码。我也写了这段代码。

#include <iostream>
using namespace std;
class matrix{
    public:
        int a[100][100], n;
        matrix(int b[100][100], int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    a[i][l]=b[i][l];
                }
            }
            n=n;
        }
        matrix(){}
        void matrix_input(int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    cin >> a[i][l];
                }
            }
        }
        void matrix_print(int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    cout << a[i][l] << " ";
                }
                cout << endl;
            }
        }


} ;
matrix operator + (matrix x, matrix y){
            int s;
            int n=x.n;
            matrix sum;
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    sum.a[i][l]=y.a[i][l]+x.a[i][l];

                }
            }
            return sum; 
}

int main(){
    int n;
    cin >> n;
    matrix o;
    o.matrix_input(n);
    matrix c;
    c.matrix_input(n);
    matrix sum;
    sum=o+c;
    sum.matrix_print(n);
    return 0;
}
4

2 回答 2

2

您的主要错误在于该行n=n,这是一个自我分配。

正如你可以猜到的,当 n 是一个整数(并且应该是大多数时候)时,这几乎是一个空操作。你的意思是this->n = n

(更好的方法是不冲突命名,但小修复会起作用。您还需要修复 operator+ 来分配sum.n = n;

localn参数优先于类成员,因此您需要this->n限定类成员。

顺便说一句,您的矩阵非常大(10,000 个整数),因此复制起来很昂贵。因此operator+,如果将其参数作为 const 引用,您的重载会更有效。

大概n是一个逻辑大小,因为物理上你的矩阵总是 100 * 100。你的默认构造函数至少应该初始化n为 0,否则试图读取这个矩阵的后续行为将是未定义的。在读取可能超出矩阵范围的内容时,您应该进行断言检查。(您的 operator+ 可以检查两者是否具有相同的尺寸)。

如果你想使用“动态”大小,那么你只使用你将实际用于矩阵的内存资源,你会以不同的方式实现它。我想这对你的水平来说是一个更高级的练习。

顺便说一句,它“一直打印 0”是随机的,因为您应该得到的行为实际上是未定义的,因为x.nsum.n此外)是您正在读取的未初始化变量。

于 2013-04-11T12:06:58.320 回答
2

在您的矩阵构造函数中,n = n将参数分配给自身。你可能的意思是this->n = n;。但是,最好使用成员初始化器列表:

matrix(int b[100][100], int n) : n(n)
{
  for(int i=0; i<n; i++) {
    for(int l=0; l<n; l++) {
        a[i][l]=b[i][l];
    }
  }
}

而你的operator +没有设置sum.n

更新

matrix_input()也不修改矩阵的n成员。换句话说,您的类不维护自己的不变量。x.n在里面查询operator +是没有意义的。

您应该进行修改matrix,使其成员n始终有效并反映矩阵中的内容。然后,您可以n从中删除参数matrix_print()

顺便说一句,你为什么叫你的成员函数matrix_something?它们已经在matrix. 只是inputprint会很好。

于 2013-04-11T12:07:45.657 回答