如何使用 c++ 中的 = 运算符分别分配复杂变量的实部和虚部?

How to assign the real and imaginary parts of complex variables, individually, using the = operator in c++?

提问人:For 提问时间:9/16/2023 最后编辑:For 更新时间:9/16/2023 访问量:68

问:

我正在尝试使用该类型来实现一个 Point 类,以解决几何问题。complex<>

我希望能够通过操作数分别分配变量的实部和虚部的值。=

喜欢这个:

class Point
{
public:
    complex<int> my_point;

    int& real(); // This should assign `my_point.real()` using `=`.
    int& imag(); // Same for `my_point.imag()`.
}

Point p;        // p is {0, 0}
p.real() = 10;  // p is {10, 0}
p.imag() = 20;  // p is {10, 20}

如果能够使用相同的语法检索这些值,那将非常有帮助。

cout << p.imag(); // p is {10, 20}, so this should print `20`.

我该怎么做?

C++ 几何 复数 赋值运算符

评论

0赞 Shreeyash Shrestha 9/16/2023
我从未使用过复杂,但这不是你给变量赋值的方式
0赞 For 9/16/2023
@ShreeyashShrestha我明白了。我发现修改复杂变量的唯一方法是修改它整个: ,或者通过 和 functions: 中的参数修改它。不过,与操作员一起分配每个零件会非常方便。我希望有办法。p.my_point = {10, 20};realimagp.my_point.real(10)=
0赞 Ted Lyngmo 9/16/2023
为什么你觉得你需要一个胶囊?超载?如果你使用,你已经拥有了所有需要的自然重载 - 以及你想要的成员函数。std::complex<T>
0赞 For 9/16/2023
@TedLyngmo 胶囊是为了让我能够在 中实现一些几何算法,同时仍然能够使用变量的功能。不过,即使一开始就没有胶囊,我仍然不知道如何使用运算符单独分配给 和 的部分。Pointstd::complex<T>real()imag()std::complex<T>=
0赞 Ted Lyngmo 9/16/2023
@For然后添加成员函数?template<class T> struct mycapsule { T x, y; };

答:

-1赞 Shreeyash Shrestha 9/16/2023 #1

我想这回答了你的问题:

class Point
{
public:
    std::complex<int> my_point;

    int& real()
    {
        return my_point.real();
    }

    int& imag()
    {
        return my_point.imag();
    }

    int real() const
    {
        return my_point.real();
    }

    int imag() const
    {
        return my_point.imag();
    }
};

然后使用您想要使用的方式来分配或获取实点和虚点的值。也许是这样的:

int main()
{
    Point p;
    p.real() = 10;
    p.imag() = 20;

    std::cout << p.imag() << std::endl;

    return 0;
}

试试看,让我知道它是否有效

编辑由于之前的尝试没有奏效,我想你需要施放它。我尝试使用重新解释投射,它对我有用。这是我尝试过的代码:

//same code as previous
    int& real()
    {
        return reinterpret_cast<int*>(&my_point)[0];
    }

    int& imag()
    {
        return reinterpret_cast<int*>(&my_point)[1];
    }

    int real() const
    {
        return reinterpret_cast<const int*>(&my_point)[0];
    }

    int imag() const
    {
        return reinterpret_cast<const int*>(&my_point)[1];
    }
//remaining same code here as well 

让我知道它是否适合你,因为它对我有用

评论

0赞 For 9/16/2023
不幸的是,它无法编译。 似乎不能作为函数的有效返回类型。同样的情况也发生在 。my_point.real()int& real()int& imag()
0赞 Shreeyash Shrestha 9/16/2023
你试过铸造它吗?
0赞 Shreeyash Shrestha 9/16/2023
nvm 我只是要写一个答案
0赞 Ted Lyngmo 9/16/2023
不过,@ShreeyashShrestha似乎是一个更完整的实现。using Point = std::compex<int>;
0赞 Shreeyash Shrestha 9/16/2023
就像我说的,我对复杂了解不多。对于这个答案,我只是搜索了 std::complex 的 real 和 imag 函数,并使用运算符重载来传递一些 setter 和 getter。我自己很惊讶它起作用了。
0赞 doug 9/16/2023 #2

使用允许 constexpr 的异常,如图所示,并调整 Shreeyash 的想法:

对于 std::complex 类型的任何对象 z,reinterpret_cast<T(&)[2]>(z)[0] 是 z 的实部,reinterpret_cast<T(&)[2]>(z)[1] 是 z 的虚部

只需将 T 替换为 如果您只需要一个 int 复杂类型,则删除模板即可。int

#include <complex>
#include <iostream>

template <class T>  // floating point type
class Point
{
public:
    std::complex<T> my_point;

    T& real()
    {
        return reinterpret_cast<T(&)[2]>(my_point)[0];
    }

    T& imag()
    {
        return reinterpret_cast<T(&)[2]>(my_point)[1];
    }

    T real() const
    {
        return my_point.real();
    }

    T imag() const
    {
        return my_point.imag();
    }
};

int main()
{
    Point<int> p;
    p.real() = 10;
    p.imag() = 20;

    std::cout << p.imag() << std::endl;
    return 0;
}