在C ++中重载提取操作符>>

可能重复:
运算符超载

我必须编写一个时钟程序,在该程序中,我可以输入小时,分钟和秒钟,同时超载提取操作员。 这些是我的代码:

clockType.h

#include<iostream>
using namespace std;

class clockType
{
public:
   clockType();
   void getTime();
   friend istream& operator>>(istream&, const clockType);
private:
   int hr, min, sec;
}

clockType.cpp

#include<iostream>
#include'clockType.h"
using namespace std;

clockType::clockType()
{
    hr = 0;
    min = 0;
    sec = 0;
}

void clockType::getTime()
{
    while(hr>=24)
        hr = hr - 24;
    while(min>=60)
        min = min - 60;
    while(sec>=60)
        sec = sec - 60;
    cout<<setfill('0')
        <<setw(2)<<hr<<":"
        <<setw(2)<<min<<":"
        <<setw(2)<<sec<<endl;
 }

 istream& operator>>(istream& in, clockType cl)
 {
    in>>cl.hr>>cl.min>>cl.sec;
    return in;
 }

entryPoint.cpp

 #include<iostream>
 #include'clockType.h'

 using namespace std;

 int main()
 {
   clockType clock;
   cout<<"Enter hr, min, sec";
   cin>>clock;
   clock.getTime();
   return 0;
 }

没有错误。 我的问题是,当我输入hr,min和sec时,它为什么输出00:00:00? 为什么“>>”将它的值传递给对象时钟?


operator>>的签名需要

istream& operator>>(istream& in, clockType& cl) 

也就是说,它应该接受对clockType实例的引用。

你的当前代码接受一个clockType实例,所以当调用操作符时,你的clock的临时副本被创建并且操作员工作。 该副本然后被丢弃,并且原始clock保持不变。

这里的另一个问题是,你没有检查你是否成功地从你的输入流中读取任何东西。 任何和所有的>>对运营in可能会失败,这可能让cl处于未知状态。 所以首先你应该测试一下if(in >> cl.hr)

这还不够,因为第一次读取操作( hr )可能成功,但下一次可能会失败; 这将会使你的cl处于未知状态。 如果提取操作符具有事务语义,这将是一件好事,即它会更新所有三个成员,否则它将使对象保持其先前的状态。 一种方法是首先读取局部变量,并且只有当所有三个读取成功时才将值复制到cl


你的提取操作符应该改变你传递给它的对象而不是它的副本。 也就是说,你也想让抽取运算符的第二个参数成为一个非const引用:

std::istream& operator>> (std::istream& in, clockType& cl) { ... }

顺便说一句,在使用结果之前,应始终检查提取是否有效:

if (std::cin >> clock) { ... }

istream& operator>>(istream& in, clockType cl)

应该:

istream& operator>>(istream& in, clockType &cl)   // (note the &)
链接地址: http://www.djcxy.com/p/12699.html

上一篇: overloading the extraction operator >> in C++

下一篇: C++ chaining of the operator << for std::cout like usage