这可能是一个新手问题,但我无法通过检查我所拥有的书来解决这个问题。 该类的构造函数初始化两个双精度数,我希望以下代码用<<。

输出这两个双精度数。
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 指针,因此运算符函数应该只接受一个参数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top