我试图弄清楚如何为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&)'
什么是正确的方法?
我将operator *函数放在头文件中。将其移至.cpp后,它便可以正确编译。
答案 0 :(得分:2)
您的文件似乎已被多次包含,如今大多数编译器都支持#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