Почему я получаю ошибку: недопустимые операнды в двоичное выражение после перегрузки = операнда?

#c

Вопрос:

Я пытаюсь перегрузить = оператор для простого математического Vector класса, чтобы суммировать элементы двух векторов, как это:

 vector1  = vector2
 

Часть Vector2D.h :

 #ifndef _VECTOR2D_H_
#define _VECTOR2D_H_

class Vector2D
{
public:

    Vector2D():x(0),y(0){}
    ~Vector2D(){}

    /* All the mathematical operation ... */

    // Overloading operators
    Vector2Damp; operator =(const Vector2Damp; rhs);
    Vector2Damp; operator*=(const Vector2Damp; rhs);
    Vector2Damp; operator/=(const Vector2Damp; rhs);
    Vector2Damp; operator-=(const Vector2Damp; rhs);

private:

    double x;
    double y;
};
 

Затем часть Vector2D.cpp :

 #include "Vector2D.h"

Vector2Damp; Vector2D::operator =(const Vector2Damp; rhs)
{
    x  = rhs.x;
    y  = rhs.y;
    return *this;
}
 

Теперь, в .cpp классе, я хочу использовать оператор:

 void MovingObject::move()
{
    m_pVelocity  = m_pAcceleration;
    m_pVelocity->limit(m_fMax_speed);
    m_pPosition  = m_pVelocity();
    m_pAcceleration->zero();
}
 

Переменные m_pVelocity , m_pAcceleration и m_pPosition все Vector2D* они являются указателями.

Когда я пытаюсь скомпилировать, это то, что я получаю от компилятора:

результат компилятора

Почему это происходит? Я прочитал много статей, и я видел много примеров, и все они работают, но мой не работает.

Я что-то упускаю?

Комментарии:

1. Вы обращаетесь = к указателям, а не к объектам, на которые они указывают.

2. ~Vector2D(){} — Не по теме, но не пишите пустые деструкторы без реализации. Либо удалите его, либо объявите как =default . Я знаю, что вы, возможно, видели другие примеры кода, которые могут выполнять этот пустой деструктор, но это считается запахом кода, начиная с C 11.

3. Это не решает вопроса, но имена, начинающиеся с подчеркивания, за которым следует заглавная буква ( _VECTOR2D_H_ ), и имена, содержащие два последовательных подчеркивания, зарезервированы для использования реализацией. Не используйте их в своем коде.

4. Просто чтобы показать вам последствия этого пустого деструктора, посмотрите на эту программу . Простое изменение удаления пустого деструктора изменяет свойства класса. Это может иметь решающее значение, когда дело доходит до компилятора (или другого шаблонного кода), работающего с классом.

5. Почему вы используете Vector2D указатели? Есть ли полиморфизм или они указывают на объекты, принадлежащие «в другом месте»?

Ответ №1:

Похоже, что на этой строке у вас есть два указателя

 m_pVelocity  = m_pAcceleration;
 

поэтому вам нужно будет разыменовать их, чтобы использовать этот оператор

 *m_pVelocity  = *m_pAcceleration;
 

Комментарии:

1. Черт! Это сработало как заклинание! Как мне не стыдно, я забыл об этом!! Спасибо всем за комментарии и помощь в улучшении. И вы правы, я перейду от указателей к ссылкам, не нужно быть указателями, по крайней мере, не этими.