有人可以向我解释一下我的运算符(operator)有问题吗:
Matrix3D Matrix3D::operator*(Matrix3D& m) {
Matrix3D ret;
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
ret._data[i][j]=0.0;
for(int k=0;k<4;k++) {
ret._data[i][j] += (this->_data[i][k]*m._data[k][j]);
}
}
}
return ret;
}
Matrix3D& Matrix3D::operator=(Matrix3D& m) {
if(this==&m) {
return *this;
}
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
this->_data[i][j] = m._data[i][j];
}
}
return *this;
}
Matrix3D Matrix3D::Rotation(double ax, double ay, double az) {
Matrix3D rotX;
Matrix3D rotY;
Matrix3D rotZ;
rotX(
1, 0, 0, 0,
0, cos(ax), -sin(ax), 0,
0, sin(ax), cos(ax), 0,
0, 0, 0, 1
);
rotY(
cos(ay), 0, sin(ay), 0,
0, 1, 0, 0,
-sin(ay), 0, cos(ay), 0,
0, 0, 0, 1
);
rotZ(
cos(az), -sin(az), 0, 0,
sin(az), cos(az), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
// Matrix3D ret;
// ret = rotX*rotY*rotZ;
// This doesn't work
// C:\(...)\Matrix3D.cpp|100|error: no match for 'operator=' in 'ret = Matrix3D::operator*(Matrix3D&)(((Matrix3D&)(& rotZ)))'|
// however this does work
Matrix3D ret = rotX*rotY*rotZ;
return ret;
}
如上面的代码所述,类似
Matrix3D ret;
ret = rotX*rotY*rotZ;
将导致
C:\(...)\Matrix3D.cpp|100|error: no match for 'operator=' in 'ret = Matrix3D::operator*(Matrix3D&)(((Matrix3D&)(& rotZ)))'|
编译错误,而类似
Matrix3D ret = rotX*rotY*rotZ;
将在没有任何警告或错误的情况下进行编译(不知道矩阵是否正确,尚未检查过……)。
最佳答案
实际上,两个运算符都被错误地声明。他们应该使用const
引用以允许右值被接受。
Matrix3D Matrix3D::operator*(const Matrix3D& m) const
// ^^^^^ ^^^^^
// this too, since you're not
// changing the LHS during '*'.
Matrix3D& Matrix3D::operator=(const Matrix3D& m)
// ^^^^^
您会看到
*
与rotX*(rotY*rotZ)
不兼容。编译
Matrix3D ret = rotX*rotY*rotZ;
的原因是因为根本没有调用operator=
。它只是将Matrix3D的副本构造函数调用为乘法结果。而且乘法有效,因为rotX * rotY * rotZ
被重写为rotX.operator*(rotY).operator*(rotZ)
和
rotY
和rotZ
都是左值,因此可以将它们绑定(bind)到Matrix3D&
。关于c++ - C++中的奇怪赋值/乘法运算符行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8538425/