帮助重载<<和>>显示两个值
-
06-07-2019 - |
题
这可能是一个新手问题,但我无法通过检查我所拥有的书来解决这个问题。 该类的构造函数初始化两个双精度数,我希望以下代码用<<。
输出这两个双精度数。Complex x( 3.3, 1.1 );
cout << "x: " << x;
在此之后我需要重载&gt;&gt;接受两个双打。 这是我的第一个问题,所以如果我提供的信息缺乏通知我
编辑: 我现在有了构造函数和重载语句:
#include "Complex.h"
Complex::Complex( double realPart, double imaginaryPart )
: real( realPart ),
imaginary( imaginaryPart )
{
}
std::istream& operator>>(std::istream& strm, const Complex &c)
{
double r,i;
strm >> r >> i;
c = Complex(r,i);
return strm;
}
我知道我必须改变“const Complex&amp; c”。和“c = Complex(r,i);”但我不知道该如何去做。 此外,我将在这里说这不是关于std库的Complex类,尽管它基于相同的想法。到目前为止,每个人都得到了很大帮助,但我今天有一个愚蠢的案例。
解决方案
运营商LT;&LT; :
std :: cout
是一个 std :: ostream
对象,所以你必须为 ostream重载
,它将 operator&lt;&lt;
std :: complex&lt; double&gt;
作为参数,假设您使用标准头复合体中的 std :: complex&lt; double&gt;
。由于您不应对标准容器和类进行内部更改,因此请将其设置为独立。
#include <iostream>
#include <complex>
std::ostream& operator<<(std::ostream& strm, const std::complex<double>& c)
{
strm << "real: " << c.real() << "imag: " << c.imag();
return strm;
}
运营商GT;&GT; :
operator&gt;&gt;
采用 std :: istream
对象,它与 std :: ostream
的作用相反。如果您像这样使用流进行序列化,那么为它们启用异常也是个好主意。通常你只想抛出 std :: ios :: badbit
。
#include <iostream>
#include <complex>
std::istream& operator>>(std::istream& strm, std::complex<double>& c)
{
double r,i;
strm >> r >> i;
c = std::complex<double>(r,i);
return strm;
}
如果您需要访问该类的内部成员,您可以将重载的函数定义为朋友。但由于std :: complex :: real()和std :: complex :: imag()是公共接口的一部分,所以这里不需要。对于istream示例,我们只需调用copy-constructor,它也是公共接口的一部分。
我以为你想在这里使用cin和cout。但是如果你想让运算符超载其他东西,同样适用。如果在类定义中实现运算符,则可以访问 this
指针,因此运算符函数应该只接受一个参数。