[英]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.