我正在研究一个程序来检测一个三角形是否嵌套在另一个三角形中.
在这里,我创建了结构点,将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-'不匹配." 我真的不明白发生了什么,我想它不明白我想要哪个'点',因为我一起使用它们?
我做了研究,发现操作员超载,但这对我来说有点混乱.我真的不知道如何实现运算符重载.
如果有人能告诉我如何做到这一点,那将会很有帮助.
这意味着编译器不知道如何减去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.(如果你曾经使用过一个库DateTime和TimeSpan类,你已经看到了行动.C++这个概念本身使用它的标准库的time_pointVS duration,在命名空间中都发现std::chrono,你有一个二维版本在这里.)