【问题标题】:Showing garbage values when adding two matrix using operator overloading使用运算符重载添加两个矩阵时显示垃圾值
【发布时间】:2020-06-30 20:00:47
【问题描述】:

请帮助我,因为我是编程新手,我已经制作了这个程序,它对我来说看起来不错,但我得到的是垃圾值而不是两个矩阵的总和。我已经应用了运算符重载的概念来找到总和两个矩阵,但我一次又一次地得到垃圾值?请帮我看看问题出在哪里?谢谢。任何帮助都非常感谢

#include<iostream>
#include<string>

using namespace std;
class Matrix {
private:
    int matrix[2][2];
public:
    Matrix operator + (Matrix Sum)
    {
        Matrix sum[2][2];
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                sum[i][j].matrix[i][j] = matrix[i][j] + Sum.matrix[i][j];
                return(sum[i][j]);
            }
        }
    }

    void setMatrix(int m[][2])
    {
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                matrix[i][j] = m[i][j];
            }
        }
    }
    void Display() 
    {
          cout << "\n\nThe matrix finally equals: ";   
         for (int i = 0; i < 2; i++)
        {
            cout << " ";
            for (int j = 0; j < 2; j++)
            {
               cout<<matrix[i][j];
                if (j == 2 - 1)
                    cout << endl;
            }
        } 
    }
};


int main()
{
    Matrix m1, m2,sum;
   
    const int size=2;
    int matrix1[size][size];
    int matrix2[size][size];
    cout << "Enter the values of matrix 1 (2 X 2)\n\n";
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            cin >> matrix1[i][j];
        }
    }

    cout << "Enter the values of matrix 2 (2 X 2)\n\n";
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            cin >> matrix2[i][j];
        }
    }
    cout <<"\n\nSetting the values now\n\n";
    m1.setMatrix(matrix1);
    m2.setMatrix(matrix2);
    sum = m1 + m2;
    cout << "\n\nMatrix 1 (2 X 2) is : ";
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            cout << matrix1[i][j] << "  ";
            if (j == size - 1)
                cout << endl;
        }
    }

    cout << "\n\nMatrix 2 (2 X 2) is : ";
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            cout << matrix2[i][j] << "  ";
            if (j == size - 1)
                cout << endl;
        }
    }

    cout << "\n\nSum of two matrices is equal to (2 X 2) is : ";
    sum.Display();
    return 0;
}

【问题讨论】:

  • 我认为您需要花一些时间to explain your code to your rubber duck(或室友或其他合适的替代方案)。您的operator+ 函数至少有两个问题,这样的解释应该可以帮助您找到。
  • @RichardCritten 是这么想的,但 sum[i][j] 实际上是 Matrix
  • @churill 刚刚发现 sum Sum 在同一个函数中
  • 您在第一次循环迭代中返回,所以ij 都不会有除0 之外的任何值。只有sum[0][0].matrix[0][0] 会有一个初始化值;其他 3 个矩阵条目将是垃圾。
  • @bilal 这对编译器来说不是问题 - 这对我们容易出错的人来说是个问题

标签: c++ oop operator-overloading garbage


【解决方案1】:

让我们仔细看看你operator+,有两个主要错误:

  • Matrix sum[2][2]; 是一个矩阵数组,但您只想返回一个 Matrix,而不是多个。名称也不好,因为您已经有一个名称相似的参数。是的,C++ 是区分大小写的,但是这样的相似名称对于人类读者来说是有问题的;)。

  • 看看return 在哪里。它将在第一次迭代期间返回,例如

    sum[i][j].matrix[i][j] = matrix[i][j] + Sum.matrix[i][j];
    

    将只调用一次,ij 为零。因此它只设置 一个 条目并在之后立即返回(其他 3 个值未初始化)。这就是垃圾值的来源,从技术上讲,它是未定义的行为。

这是函数的外观,但请不要只是复制粘贴,而是要花一些时间来理解它。

Matrix operator + (Matrix rhs) // One of the two names needed to change.
{
    Matrix sum; //only one value with a proper name
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            // better be explicit and use this, imo
            sum.matrix[i][j] = this->matrix[i][j] + rhs.matrix[i][j];
        }
    }

    return sum; // return only after all the calculations.
}

【讨论】:

  • 非常感谢您的回答很好,并提供了完整的解释。非常感谢。
  • 但是编译器不允许返回结果
  • 哦,抱歉,打错字了,一定是return sum;
  • 没问题,谢谢,我现在明白了,谢谢
  • @bilal 不确定是否有答案。主要是训练。只是尝试新事物,犯大量愚蠢的错误并从中学习。
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多