帮助重载<<和>>显示两个值

时间:2009-11-28 02:36:41

标签: c++ operator-overloading

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

输出这两个双精度数。
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类,尽管它基于相同的想法。到目前为止,每个人都得到了很大帮助,但我今天有一个愚蠢的案例。

1 个答案:

答案 0 :(得分:2)

运营商LT;&LT; :

std::cout是一个std::ostream对象,因此您必须为operator<<重载ostream,假设您使用std::complex<double>作为参数1}}来自标准标题复合体。由于您不应对标准容器和类进行内部更改,因此请将其设置为独立。

std::complex<double>

运营商GT;&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; } 采用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; } 指针,因此运算符函数应该只接受一个参数。