我正在研究一个程序来检测一个三角形是否嵌套在另一个三角形中。
在这里,我创建了结构点,将x和y定义为双精度。
struct Point {
double x;
double y;
};
这是我实现struct的地方:
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;
}
当我编译它时告诉我,“'p - line.LineSegment :: StartPoint'中的'operator-'不匹配。” 我真的不明白发生了什么,我想它不明白我想要哪个'点',因为我一起使用它们?
我做了研究并发现操作员超载,但这对我来说有点混乱。我真的不知道如何实现运算符重载。
如果有人能告诉我如何做到这一点,那将会有所帮助。
答案 0 :(得分:8)
这意味着编译器不知道如何减去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;
}
有关更多指导,请参阅our C++-FAQ entry on Operator Overloading。那里有很多好的建议可以帮助你避免一些陷阱,以及如何最大限度地重复使用代码和可读性的好例子和建议(这实际上意味着可维护性)。
在这种情况下,您还应该问自己是否要区分绝对坐标对和相对坐标对。如果这样做,那么两点之间的差异应该是Size
或Offset
,而不是Point
。 (如果您曾经使用过具有DateTime
和TimeSpan
类的库,那么您已经看到了这个概念.C ++本身将它用于标准库的time_point
vs {{1} },都在命名空间duration
中找到。你在这里有二维版本。)
答案 1 :(得分:2)
struct Point {
double x;
double y;
Point operator-(const Point& that) const
{
Point result;
result.x = this->x - that.x;
result.y = this->y - that.y;
return result;
}
};
答案 2 :(得分:2)
如果要减去点数,则需要提供重载运算符来执行此操作。 C ++不会自动为类类型生成算术运算,因为大多数时候它们没有意义。
这样的事情应该这样做:
Point operator-(Point lhs, Point rhs) {
return {lhs.x-rhs.x, lhs.y-rhs.y};
}
虽然我可能会为返回类型引入一个新类型(Vector
或Offset
或其他东西),但是为了防止在使用点时使用点之间偏移的类别错误。
答案 3 :(得分:1)
这是一个让你入门的基本草图:
Point operator-( const Point& lhs, const Point& rhs )
{
Point result;
// make sure this is what you want:
result.x = lhs.x - rhs.x;
result.y = lhs.y - rhs.y;
return result;
}
注意这是一个自由函数,它不在Point
的定义之内。然后把它放在后面。
答案 4 :(得分:1)
看看http://www.cplusplus.com/doc/tutorial/classes2/。它对运算符重载有很好的解释。
你的代码所说的是从p中减去line.StartPoint。但是,您的结构不具有该操作的已定义行为。因此,除非告诉编译器如何使用结构执行该操作,否则不能使用语法p - line.StartPoint
。
结构中的方法签名可能如下所示:
Point operator-(const Point &other) { }
您需要将逻辑添加到该方法,告诉编译器如何对结构执行减法操作。
答案 5 :(得分:0)
如果你将两个数字相加/减去/乘以等,编译器会知道你的意思,一切都很好。如果你想减去一个类的东西,编译器本身并不知道如何做(对于任何类),但是为你提供了一个工具来定义如何一起减去两个类,它看起来像这样(使用你的Point类) :
Point operator-(Point p1, Point p2)
{
Point result;
result.x = p1.x - p2.x;
result.y = p1.y - p2.y;
return result;
}
现在,编译器通过调用此函数知道如何减去两个点。