Выражение должно иметь указатель на тип объекта - PullRequest
5 голосов
/ 15 сентября 2011

Я пишу матричную программу и в настоящее время пытаюсь умножить точку и матрицу. Я продолжаю получать сообщение об ошибке для моих объектов (результат и 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;
    }

};

Ответы [ 5 ]

16 голосов
/ 15 сентября 2011

В вашем Point классе у вас есть член element, определенный как:

double element[4];

Это одномерный массив. Однако в вашей функции вы пытаетесь получить к ней доступ, как если бы это был двух -мерный массив:

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

Я думаю, вам нужно переосмыслить, как именно должно работать ваше умножение матриц.

2 голосов
/ 15 сентября 2011

result.element - это одномерный массив.Вы используете два индекса с ним.Это не скомпилируется.Вы должны посмотреть на определение матричного умножения .

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;

}
1 голос
/ 15 сентября 2011

Point::element является double[4]. В вашем коде у вас есть Point result; result.element[i][k] = 0;. Поскольку элемент не является двумерным массивом, компилятор пытается преобразовать double в массив для использования [], но не может. Я думаю, это скопированный код с Matrix44 Matrix44::operator*(const Matrix44& M)

Всегда полезно сообщить нам, в какой строке возникла проблема в вашем примере кода.

Кроме того, функция будет иметь неправильный результат, вы устанавливаете result.element[i][k] на ноль, а затем устанавливаете 4 различных значения. Я думаю, что вы хотели добавить вместо присвоения в самом внутреннем цикле.

0 голосов
/ 23 ноября 2017

та же ошибка может показаться вводящей в заблуждение, если вы указываете на структуру, которая не доступна источнику, например,

header.h

определить структуру myStruct;

source1.c

включает header.h

myStruct structX;

source2.c

включает header.h

uint8_t * ptr2Struct = &structX;

если это так, то вы получите этот аргумент со строкой " uint8_t * ptr2Struct = & structX;

0 голосов
/ 15 сентября 2011

Вы пытаетесь получить доступ:

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

Когда у самой точки есть только одноуровневый массив:

double element[4];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...