繁体   English   中英

乘法运算符重载修改原始变量(C#)?

[英]Multiplication operator overload modifying original variable (C#)?

我正在将矩阵库作为一个学习项目,在这样做时,我已经使*运算符超载以执行矩阵乘法。 我也对其进行了重载以处理标量乘法(将矩阵的每个元素乘以两倍)。 我的问题是,当运行以下代码时,test2和test均被修改,这是不希望的。

Matrix test2 = 2 * test;

我确定这是一个问题,因为Matrix是一个类,因此通过引用传递,但是没有将Matrix更改为结构(我认为这不适合,并且在尝试时似乎不适合上班),我看不到任何解决方法。 我该如何解决?

实际的操作员代码是

public static Matrix operator *(Matrix m1, double c)
{
   Matrix ret = m1;

   for (long i = 0; i < ret.Width; i++) // Iterate over the rows.
    {
        for (long p = 0; p < ret.Height; p++) // Iterate over the columns.
        {
            ret[i, p] *= c;
        }
    }

   return ret;
}

您不应该使用代码修改现有矩阵。 该签名大声疾呼 ,它正在创建一个新的 Matrix并返回它。

我不赞成您的复制方法/构造函数是什么,但不要m1分配给ret 你应该做的副本 m1 ,修改拷贝 ,并返回副本 ,而让m1 保持不变

public static Matrix operator *(Matrix m1, double c)
{
    Matrix ret = m1.Clone(); //not sure what your "copy" method is

    //do the multiplication on ret

    return ret;
}

由于Matrix是引用类型,因此ret = m1不会复制您的输入参数,最终您将其修改。

解决此问题的正确方法是制作m1的深层副本并进行修改。 就像是:

Matrix ret = m1.MakeCopy(); // you need to define this

// and now you are free to modify ret as much as you like

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM