这是咋回事啊?友元函数和私有变量问题

selooloo 2010-01-22 09:43:36
代码如下:

#include <iostream>
#include <cctype>
#include <cstdlib>
//#include "dtime.h"
using namespace std;

class DigitalTime
{
public:
friend bool operator ==(const DigitalTime &time1,const DigitalTime& time2);
DigitalTime(int the_hour,int the_minute);
DigitalTime();
void advance(int minutes_added);
void advance(int hours_added,int minutes_added);
friend istream& operator >>(istream& ins,DigitalTime the_object);
friend ostream& operator <<(ostream& outs,const DigitalTime the_object);
private:
int hour;
int minute;
};

void read_hour(istream& ins,int& the_hour);
void read_minute(istream& ins,int& the_minute);
bool operator ==(const DigitalTime& time1,const DigitalTime& time2)
{
return (time1.hour==time2.hour && time2.minute==time2.minute);
}

DigitalTime::DigitalTime(int the_hour,int the_minute)
{
if(the_hour<0 || the_minute<0)
{
cout<<"Illegal time!\n";
system("pause");
exit(1);
}
hour=the_hour;
minute=the_minute;
}

DigitalTime::DigitalTime():hour(0),minute(0)
{}

void DigitalTime::advance(int hours_added,int minutes_added)
{
int new_hours,new_minutes;
new_minutes=minute+minutes_added;
minute=new_minutes%60;
new_hours=hour+hours_added+new_minutes/60;
hour=new_hours%24;
}

void DigitalTime::advance(int minutes_added)
{
int gross_minutes=minute+minutes_added;
minute=gross_minutes%60;
int hour_adjustment=gross_minutes/60+hour;
hour=hour_adjustment%24;
}

ostream& operator <<(ostream& outs,const DigitalTime& the_object)
{
outs<<the_object.hour<<":";
if(the_object.minute<10)
outs<<'0';
outs<<the_object.minute;
return outs;
}

istream& operator >>(istream& ins,DigitalTime& the_object)
{
read_hour(ins,the_object.hour);
read_minute(ins,the_object.minute);
return ins;
}

int digit_to_int(char c)
{
return (c-'0');
}

void read_hour(istream& ins,int& the_hour)
{
char c1,c2;
ins>> c1>>c2;
if(!(isdigit(c1) && isdigit(c2) || c2==':'))
{
cout<<"Error illegal input to read_hour.\n";
system("pause");
exit(1);
}
if(c2==':')
the_hour=digit_to_int(c1);
else
{
the_hour=digit_to_int(c1)*10 + digit_to_int(c2);
ins>>c2;
if(c2!=':')
{
cout<<"Error illegal input to read_minute.\n";
system("pause");
exit(1);
}
}
if(the_hour>24 || the_hour<0)
{
cout<<"Error illegal input to read_hour.\n";
system("pause");
exit(1);
}
}

void read_minute(istream& ins,int& the_minute)
{
char c1,c2;
if(!isdigit(c1) || !isdigit(c2))
{
cout<<"Error illegal input to read_minute.\n";
system("pause");
exit(1);
}
the_minute=digit_to_int(c1)*10 + digit_to_int(c2);
if(the_minute<0 || the_minute>60)
{
cout<<"Error illegal input to read_minute.\n";
system("pause");
exit(1);
}
}


错误如下:

15 D:\dev\c++\dtime.h
`int DigitalTime::hour' is private
16 D:\dev\c++\dtime.h
`int DigitalTime::minute' is private

别的函数都可以访问私有变量,就
friend istream& operator >>(istream& ins,DigitalTime the_object);
friend ostream& operator <<(ostream& outs,const DigitalTime the_object);
这两个函数不行,实在是蹊跷,眼睛快看爆掉了也没看有出啥错误,各位帮帮忙
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
selooloo 2010-01-22
  • 打赏
  • 举报
回复
晕,老眼昏花了,结贴
tanleihexinxin 2010-01-22
  • 打赏
  • 举报
回复
friend istream& operator >>(istream& ins,DigitalTime &the_object);
friend ostream& operator <<(ostream& outs,const DigitalTime &the_object);
kim_jinye 2010-01-22
  • 打赏
  • 举报
回复
up
Vegertar 2010-01-22
  • 打赏
  • 举报
回复
观察两个重载的第二参数,声明与定义不一致


hlyces 2010-01-22
  • 打赏
  • 举报
回复
friend istream& operator >>(istream& ins,DigitalTime the_object);
friend ostream& operator < <(ostream& outs,const DigitalTime the_object);

///没错才怪了,你改变的是DigitalTime the_object
pur_e 2010-01-22
  • 打赏
  • 举报
回复
你声明的时候没用引用,实现的时候用了
声明:friend istream& operator >>(istream& ins,DigitalTime the_object);
实现:istream& operator >>(istream& ins,DigitalTime& the_object)


被编译器认为是两个不同的函数吧,应该是,实现的那个函数不是友元
pengzhixi 2010-01-22
  • 打赏
  • 举报
回复
const DigitalTime &//这个必须的

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧