gpt4 book ai didi

c++ - 如何在自定义类实例上执行 cmath 函数?

转载 作者:行者123 更新时间:2023-11-30 01:38:59 28 4
gpt4 key购买 nike

我可以使用 C++ 中的任何方法(例如重载或模板化)来允许我将类实例作为参数传递给 cmath 函数吗?例如,如果我有一个名为 “Point” 的类(如下所示),有什么方法可以执行操作 std::abs(Point(-4, -9) ) 并让它返回 Point(4, 9)?

#include <iostream>
#include <cmath>

class Point{
private:
double x, y;

public:
Point(double x, double y) {
this->x = x;
this->y = y;
}

// Approach 1 that I would like to avoid
static Point abs1(const Point &p1) {
return Point(std::abs(p1.x), std::abs(p1.y));
}

// Approach 2 that I would like to avoid
Point abs2(void) {
return Point(std::abs(x), std::abs(y));
}
};

int main()
{
Point pt1(-4.0, -9.0), pt2;

pt2 = std::abs(pt1) // <-- What I would like to be able to do

pt2 = Point::abs1(point_d); // <-- Function call 1 that I would like to avoid
pt2 = point_d.abs2(); // <-- Function call 2 that I would like to avoid

return 0;
}

或者我是否仅限于使用需要调用 Point::abs(Point(-4, -9))Point(-4, -9) 的基于类的方法.abs()?所以简而言之,我是否可以增加 cmath 函数以接受类实例?

我环顾四周,找不到关于这个主题的任何信息,但我对 C++ 还是很陌生。因此,如果能提供有关如何执行此操作、是否可以执行此操作以及此类操作是否不明智以及如果是这样的原因的任何信息,我将不胜感激。

提前致谢。

最佳答案

你会这样做。

#include <iostream>
#include <cmath>

class Point{
double x, y;

public:
Point(double x, double y)
: x(x), y(y)
{
}

friend Point abs(const Point &p1) {
return Point(std::abs(p1.x), std::abs(p1.y));
}
};


int main()
{
using std::abs;

Point pt1(-4.0, -9.0);
double x = 5.5;

// this will work even if Point is in its own namespace
// because of ADL
Point pt2 = abs(pt1);

// this works because for this function, we have pulled
// std::abs into the global namespace
double y = abs(x);

return 0;
}

关于c++ - 如何在自定义类实例上执行 cmath 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718087/

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