C++中的运算符重载(operator-)

0 c++ operator-overloading

我正在研究一个程序来检测一个三角形是否嵌套在另一个三角形中.

在这里,我创建了结构点,将x和y定义为双精度.

struct Point {

double  x;
double  y;
};
Run Code Online (Sandbox Code Playgroud)

这是我实现结构的地方:

double eval (LineSegment line, Point p)
{

 Point p1 = p - line.StartPoint;
 Point p2 = line.EndPoint - line.StartPoint;

 return p2.x * p2.y - p1.y * p2.x;


}
Run Code Online (Sandbox Code Playgroud)

当我编译时,它告诉我,"'p - line.LineSegment :: StartPoint'中的'operator-'不匹配." 我真的不明白发生了什么,我想它不明白我想要哪个'点',因为我一起使用它们?

我做了研究,发现操作员超载,但这对我来说有点混乱.我真的不知道如何实现运算符重载.

如果有人能告诉我如何做到这一点,那将会很有帮助.

Ben*_*igt 9

这意味着编译器不知道如何减去Point对象.它知道如何减去内置类型,但是要使用具有自定义类型的运算符,您需要提供行为.

在这种情况下,您可能需要以下内容:

struct Point
{
   double  x;
   double  y;

   Point& operator-=( const Point& that )
   {
      x -= that.x;
      y -= that.y;
      return this;
   }
};

Point operator-(Point first, const Point& second)
{
    return first -= second;
}
Run Code Online (Sandbox Code Playgroud)

有关更多指导,请参阅我们的C++ - 关于运算符重载的FAQ条目.那里有很多好的建议可以帮助你避免一些陷阱,以及如何最大限度地重复使用代码和可读性(这实际上意味着可维护性)的好例子和建议.

在这种情况下,您还应该问自己是否要区分绝对坐标对和相对坐标对.如果你这样做,那么两点之间的差异应该是a Size或者Offset而不是a Point.(如果你曾经使用过一个库DateTimeTimeSpan类,你已经看到了行动.C++这个概念本身使用它的标准库的time_pointVS duration,在命名空间中都发现std::chrono,你有一个二维版本在这里.)