这可能是一个新手问题,但我无法通过检查我所拥有的书来解决这个问题。 该类的构造函数初始化两个双精度数,我希望以下代码用<<。
输出这两个双精度数。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类,尽管它基于相同的想法。到目前为止,每个人都得到了很大帮助,但我今天有一个愚蠢的案例。
答案 0 :(得分:2)
std::cout
是一个std::ostream
对象,因此您必须为operator<<
重载ostream
,假设您使用std::complex<double>
作为参数1}}来自标准标题复合体。由于您不应对标准容器和类进行内部更改,因此请将其设置为独立。
std::complex<double>
#include <iostream>
#include <complex>
std::ostream& operator<<(std::ostream& strm, const std::complex<double>& c)
{
strm << "real: " << c.real() << "imag: " << c.imag();
return strm;
}
采用operator>>
对象,与std::istream
的对象相反。如果您像这样使用流进行序列化,那么为它们启用异常也是个好主意。通常你只想要std::ostream
。
std::ios::badbit
如果您需要访问该类的内部成员,您可以将重载的函数定义为朋友。但由于std :: complex :: real()和std :: complex :: imag()是公共接口的一部分,所以这里不需要。对于istream示例,我们只需调用copy-constructor,它也是公共接口的一部分。
我以为你想在这里使用cin和cout。但是如果你想让运算符超载其他东西,同样适用。如果在类定义中实现运算符,则可以访问#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;
}
指针,因此运算符函数应该只接受一个参数。