gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:36:58 25 4
gpt4 key购买 nike

我正在开发一个程序来检测一个三角形是否嵌套在另一个三角形中。

我在这里创建了结构点来将 x 和 y 定义为 double 值。

struct Point {

double x;
double y;
};

这里是我实现结构的地方:

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-' 不匹配。”我真的不明白发生了什么,我猜它不明白我想要哪个“点”,因为我一起使用它们?

我进行了研究并发现运算符重载,但这让我有点困惑。我真的不知道如何实现运算符重载。

如果有人能告诉我具体如何去做,那将会很有帮助。

最佳答案

这意味着编译器不知道如何减去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 .那里有很多好的建议可以帮助您避免一些陷阱,还有很好的示例和建议如何最大限度地提高代码的重用性和可读性(这实际上意味着可维护性)。

在这种情况下,您还应该问问自己是否要区分绝对坐标对和相对坐标对。如果这样做,则两点之间的差异应该是 SizeOffset,而不是 Point。 (如果您曾经使用过包含 DateTimeTimeSpan 类的库,您就会看到这个概念的实际应用。C++ 本身将它用于标准库的 time_point duration,都在命名空间 std::chrono 中找到。这里有一个二维版本。)

关于c++ - C++ 中的运算符重载 (operator-),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18748465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com