表达式必须有指向对象类型的指针

Expression must have pointer to object type

本文关键字:对象 类型 指针 表达式      更新时间:2023-10-16

我正在写一个矩阵程序,我目前正试图乘以一个点和一个矩阵。我的对象(result和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;
    }
};

在您的Point类中,您将element成员定义为:

double element[4];

这是一个一维数组。然而,在你的函数中,你试图访问它,就好像它是一个两个维数组:

result.element[i][k]
P.element[j][k]

我认为你需要重新思考你的矩阵乘法应该如何工作。

结果。元素是一个一维数组。你用了两个指标。这将无法编译。你应该看看矩阵乘法的定义。

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;
}

Point::elementdouble[4]。在您的代码中,您有Point result; result.element[i][k] = 0;。由于element不是二维数组,编译器试图将双精度型转换为数组,以便对其使用[],但它不能。我猜这是从Matrix44 Matrix44::operator*(const Matrix44& M)

复制粘贴的代码

它也总是有助于告诉我们样例代码中哪一行有问题。

此外,该函数将有不正确的结果,您将result.element[i][k]设置为零,然后将其设置为4个不同的值。我想你的意思是在最内层循环中添加而不是分配

您正在访问:

result.element[i][k] = element[i][j] * P.element[j][k] + result.element[i][k];

当Point本身只有一级数组时:

double element[4];

如果指向源不可访问的结构体,则可能出现同样的错误,例如

header.h

定义struct myStruct;

source1.c

<标题>包括header.h h1> source2.c <标题>包括header.h h1> 果是这种情况,你会得到这个错误行"uint8_t * ptr2Struct = &structX;