我正在编写矩阵程序,目前我正在尝试将点和矩阵相乘。我一直在我的对象上得到一个错误(结果和P)“这个函数中表达式必须有指向对象类型的指针”:
//Point Class functions
Point Matrix44::operator*(const Point & P){
Point result;
for (int i = 0; i < 4; i++) {
for (int k = 0; k < 4; k++) {
result.element[i][k] = 0;
for (int j = 0; j < 4; j++) {
result.element[i][k] = element[i][j] * P.element[j][k] + result.element[i][k];
}
}
}
return result;
}
我的两个课程是:
//Matrix class
class Point;
class Matrix44 {
private:
double element[4][4];
public:
Matrix44(void);
Matrix44 transpose(void) const;
friend istream& operator>>(istream& s, Matrix44& t);
friend ostream& operator<<(ostream& s, const Matrix44& t);
Matrix44 operator *(Matrix44 b);
Point operator*(const Point & P);
};
//Point class
class Point {
double element[4];
friend class Matrix44;
public:
Point(void) {
element[0] = element[1] = element[2] = 0;
element[3] = 1;
}
Point(double x, double y, double z){
element [0]=x;
element [1]=y;
element [2]=z;
element [3]=1;
}
};
答案 0 :(得分:16)
在Point
课程中,您将element
成员定义为:
double element[4];
这是一维数组。但是,在您的函数中,您尝试访问它,就像它是两个维数组一样:
result.element[i][k]
P.element[j][k]
我认为你需要重新考虑你的矩阵乘法应该如何工作。
答案 1 :(得分:2)
result.element是一维数组。你正在使用两个索引。那不会编译。你应该看一下matrix multiplication的定义。
Point Matrix44::operator*(const Point & P){
Point result;
for (int i = 0; i < 4; i++) {
result.element[i] = 0;
for (int j = 0; j < 4; j++) {
result.element[i] += element[i][j] * P.element[j];
}
}
return result;
}
答案 2 :(得分:1)
Point::element
是double[4]
。在您的代码中,您有Point result; result.element[i][k] = 0;
。由于element不是二维数组,因此编译器会尝试将double转换为数组以在其上使用[]
,但它不能。我猜这是来自Matrix44 Matrix44::operator*(const Matrix44& M)
在示例代码中告诉我们哪个行存在问题总是有帮助的。
此外,该函数的结果不正确,您将result.element[i][k]
设置为零,然后将其设置为4个不同的值。我认为你的意思是在最里面的循环中添加而不是赋值。
答案 3 :(得分:0)
您正尝试访问:
result.element[i][k] = element[i][j] * P.element[j][k] + result.element[i][k];
当Point本身只有一个级别的数组时:
double element[4];
答案 4 :(得分:0)
如果您指向源无法访问的结构,则相同的错误可能会出现误导,例如,
header.h
source1.c
myStruct structX;
source2.c
uint8_t * ptr2Struct = &structX;
如果是这种情况,那么你会用行&#34; uint8_t * ptr2Struct =&amp; structX;