提问人:For 提问时间:9/16/2023 最后编辑:For 更新时间:9/16/2023 访问量:67
如何在 c++ 中使用 = 运算符分别分配复变量的实部和虚部?
How to assign the real and imaginary parts of complex variables, individually, using the = operator in c++?
问:
我正在尝试使用该类型来实现 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`.
我该怎么做?
答:
-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;
}
上一个:std::optional<T> 赋值运算符
下一个:多重分配混淆
评论
p.my_point = {10, 20};
real
imag
p.my_point.real(10)
=
std::complex<T>
Point
std::complex<T>
real()
imag()
std::complex<T>
=
template<class T> struct mycapsule { T x, y; };