【问题标题】:Expression must have pointer to object type表达式必须有指向对象类型的指针
【发布时间】:2011-09-14 21:52:02
【问题描述】:

我正在编写一个矩阵程序,目前正在尝试将一个点和一个矩阵相乘。我的对象(结果和 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;
    }

};

【问题讨论】:

    标签: c++ matrix


    【解决方案1】:

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

    double element[4];
    

    这是一个一维数组。但是,在您的函数中,您尝试访问它,就好像它是一个 二维 维数组:

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

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

    【讨论】:

    • 正是问题所在。我已经复制了我的函数并忘记更改它以适应一维数组:),谢谢!
    • 我做了同样的事情,因为我的大脑处于自动驾驶状态。感谢您的回答
    【解决方案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;
    
    }
    

    【讨论】:

      【解决方案3】:

      Point::elementdouble[4]。在您的代码中,您有Point result; result.element[i][k] = 0;。由于 element 不是二维数组,编译器尝试将 double 转换为数组以在其上使用 [],但它不能。我猜这是来自Matrix44 Matrix44::operator*(const Matrix44&amp; M)的复制粘贴代码

      告诉我们您的示例代码中的哪一行也有问题总是有帮助的。

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

      【讨论】:

        【解决方案4】:

        您正在尝试访问:

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

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

        double element[4];
        

        【讨论】:

          【解决方案5】:

          如果您指向源无法访问的结构,则可能会出现相同的错误,例如,

          header.h

          定义结构 myStruct;

          source1.c

          包括 header.h

          myStruct structX;
          

          source2.c

          包括 header.h

          uint8_t * ptr2Struct = &structX;
          

          如果是这样的话,那么你会得到这个带有 line " uint8_t * ptr2Struct = &structX;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 2012-01-02
            • 1970-01-01
            相关资源
            最近更新 更多