#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. Черт! Это сработало как заклинание! Как мне не стыдно, я забыл об этом!! Спасибо всем за комментарии и помощь в улучшении. И вы правы, я перейду от указателей к ссылкам, не нужно быть указателями, по крайней мере, не этими.