我有一个简单的算子+重载方法,用于类Macierz,它应该从对象获得2d矩阵变量,并将所有这个矩阵变量与另一个Macierz对象的相同字段相加。
Macierz & operator + (Macierz &f) {
Macierz newM;
for (int i = 0; i < length; i++)
for (int j = 0; j < length; j++)
newM.macierz[i][j] = macierz[i][j] + f.macierz[i][j];
return newM;
}
计算工作正常。显示newM
变量会产生正确的值,但是当我尝试使用它时:
float y[3][3] = { {1.00f, 2.00f, 3.00f}, { 4.00f, 5.00f, 6.00f }, { 7.00f, 8.00f, 9.00f } };
Macierz m5(y); //fill m5 array with values from above
Macierz m2(2.00f); //fill m2 entirely with 2.00f values
cout << m2 + m5;
结果是一个零数组。
怎么会发生这种情况? macierz
变量是一个简单的float[3][3]
字段。
任何帮助都会很棒
答案 0 :(得分:5)
结果是一个零数组。
您正在返回对函数局部变量的引用。函数返回后,引用将成为悬空引用。因此,您的程序具有未定义的行为。
将函数更改为按值返回。
// Remove the reference type specifier
// |
// v
Macierz operator + (Macierz &f) {
Macierz newM;
...
return newM;
}
我建议对该功能进行进一步的改进。
const
成员函数。const&
。通过这些更改,您也可以使用const
对象来使用该功能。
Macierz operator + (Macierz const& f) const {
Macierz newM;
...
return newM;
}
相关帖子:Is it okay to use an overloaded operator to implement another operator overload?。