Как создать оператор * (двойной) для умножения как на левую, так и на правую сторону? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь выяснить, как написать перегруженный оператор для моего класса Vector2d, который позволяет мне умножать на скаляр с левой и правой сторон.

class Vector2d
{
    double _x;
    double _y;

public:
    Vector2d(double x = 0, double y = 0) :_x(x), _y(y) {}

    Vector2d operator*(const double s) const
        { return Vector2d(_x * s, _y * s); }

    friend Vector2d operator*(const double s, const Vector2d& v);
};

Vector2d operator*(const double s, const Vector2d& v)
{
    return Vector2d(v._x * s, v._y * s);
}

Если я определю только оператор-член *, мой объект можно умножить справа на скаляр, но не на левый.Если я добавляю оператор функции друга *, я получаю сообщение об ошибке при компиляции:

Vector2D.h:61: multiple definition of `Gf::operator*(double, Gf::Vector2d const&)'
Vector2D.h:61: first defined here
Vector2D.h:61: multiple definition of `Gf::operator*(double, Gf::Vector2d const&)'

Как правильно это сделать?


Я помещал функцию оператора *в заголовочном файле.Как только я переместил его в .cpp, он скомпилировался правильно.

1 Ответ

0 голосов
/ 03 декабря 2018

Похоже, ваш файл был включен несколько раз, большинство компиляторов поддерживают #pragma once в наши дни.Вы также можете использовать защиту заголовка (проверьте определение токена перед его определением вместе с остальной частью заголовка):

#ifndef VECTOR_2D
#define VECTOR_2D

class Vector2d
{
    double _x;
    double _y;

public:
    Vector2d(double x = 0, double y = 0) :_x(x), _y(y) {}

    Vector2d operator*(const double s) const
        { return Vector2d(_x * s, _y * s); }

    friend Vector2d operator*(const double s, const Vector2d& v);
};

Vector2d operator*(const double s, const Vector2d& v)
{
    return Vector2d(v._x * s, v._y * s);
}

#endif // VECTOR_2D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...