【问题标题】:Redefining operators c++重新定义运算符 C++
【发布时间】:2013-04-11 12:02:26
【问题描述】:

我试图重新定义 + 运算符,它是对 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;
}

【问题讨论】:

  • -1 你的代码不会编译,因为它不包含标题。也就是说,这不是你的代码。
  • 你能告诉我们输入应该是什么样子吗?
  • 0 删除了反对票,因为 OP 将代码更新为(可能)实际代码
  • 它将使用相关头文件(即 iostream)进行编译,并放入 using 指令。我们可以假设他这样做了,只是向我们展示了一个样本,希望我们知道细节。我可以理解您在“为我调试代码”帖子下给出了这个 -1。
  • 当我对一维矩阵求和时,总和为 0。对于 2d:0 0 0 0

标签: c++ class matrix operators


【解决方案1】:

在您的矩阵构造函数中,n = n 将参数分配给自身。你的意思可能是this-&gt;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 成员。换句话说,您的类不维护自己的不变量。在operator + 中查询x.n 则毫无意义。

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

顺便说一句,你为什么称你的成员函数为matrix_something?它们已经在matrix 的范围内。只需 inputprint 就可以了。

【讨论】:

  • 不确定设置 sum.n 在这里是否重要.. 嗯
  • @0A0D 在这个特定的例子中没有,但是从一般的角度来看,它会导致一个随机值为n的矩阵。
  • 我想我没有使用这个构造函数。创建求和矩阵时。
  • @Angew:是的,如果你只是打印它就可以了。但这可能会导致问题发生
  • @filemonster 但是您在operator + 中使用x.n,而n 从未设置。
【解决方案2】:

您的主要错误在n=n 行中,这是一个自赋值。

你可以猜到,当 n 是一个整数时,这几乎是一个空操作(并且应该是大部分时间)。你的意思是this-&gt;n = n;

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

本地n 参数优先于类成员,因此您需要this-&gt;n 来限定类成员。

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

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

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

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

【讨论】:

  • 哦,我想我在这里找到了我的问题。 x.n
  • 需要在构造函数中设置this->n,在operator+中设置sum.n
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多