operator<<的问题。

yumangmang 2008-04-03 09:55:25
大家好!
清明节快乐!!

今天我学习C++的时候学到了操作符重载这个部分,看了书以后自己按照书里的范例背写一个类的设计,但是总是出现这个错误:
--------------------Configuration: time - Win32 Debug--------------------
Compiling...
mytime0.cpp
E:\VC++STUDY\time\mytime0.cpp(83) : error C2248: 'hours' : cannot access private member declared in class 'Time'
e:\vc++study\time\mytime0.h(10) : see declaration of 'hours'
E:\VC++STUDY\time\mytime0.cpp(83) : error C2248: 'minutes' : cannot access private member declared in class 'Time'
e:\vc++study\time\mytime0.h(11) : see declaration of 'minutes'
Error executing cl.exe.

time.exe - 2 error(s), 0 warning(s)
意思好像是说我不能访问私有成员,问题是在类的设计里面使用了友元,应该可以通过阿,而且我发现我写的代码和书里的也没有什么区别,但就是总出现上面的错误,各位给看看吧:

类定义文件mytime0.h:

#ifndef MYTIME0_H_
#define MYTIME0_H_
#include<iostream>

using namespace std;

class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int hr,int min = 0);
void addmin(int min);
void addhr(int hr);
void reset(int hr = 0,int min = 0);
Time sum(const Time & t);
Time operator+(const Time & t);
Time operator-(const Time & t);
Time operator*(unsigned int n);
friend Time operator*(unsigned int n,Time & t){return t * n;}
void show()const;
friend ostream & operator<<(ostream & os,const Time & t);
};

#endif


类方法文件mytime.cpp

#include<iostream>
#include"mytime0.h"

using namespace std;

Time::Time()
{
hours = minutes = 0;
}

Time::Time(int hr,int min)
{
hours = hr;
minutes = min;
}

void Time::addmin(int min)
{
minutes += min;
hours += minutes / 60;
minutes %= 60;
}

void Time::addhr(int hr)
{
hours += hr;
}

void Time::reset(int hr,int min)
{
hours = hr;
minutes = min;
}

Time Time::sum(const Time & t)
{
Time sm;
sm.minutes = minutes + t.minutes;
sm.hours =hours + t.hours + sm.minutes / 60;
sm.minutes %= 60;
return sm;
}

Time Time::operator+(const Time & t)
{
Time sm;
sm.minutes = minutes + t.minutes;
sm.hours =hours + t.hours + sm.minutes / 60;
sm.minutes %= 60;
return sm;
}

Time Time::operator-(const Time & t)
{
Time sub;
sub.minutes = minutes - t.minutes;
if(sub.minutes > 0)
sub.hours = hours - t.hours;
else{
sub.minutes += 60;
sub.hours = hours - t.hours - 1;
}
return sub;
}

Time Time::operator*(unsigned int n)
{
Time mul;
mul.minutes = minutes * n;
mul.hours = hours * n + mul.minutes/60;
mul.minutes %= 60;
return mul;
}


void Time::show()const
{
cout<<"it's "<<hours<<" hour(s),"<<minutes<<" minute(s)"<<endl;
}

ostream & operator<<(ostream & os,const Time & t)
{
os<<"it's "<<t.hours<<" hour(s),"<<t.minutes<<" minute(s)"<<endl;//错误行,咋回事阿??
return os;
}


...全文
65 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yumangmang 2008-04-04
  • 打赏
  • 举报
回复
非常感谢各位的回复!!
我使用的是vc++6编译器,据说是带sp6的(至少启动界面上有sp6字样)。
按照各位的指点,无论是使用把<iotream>改成<iostream.h>的做法,还是将友元函数代码写到类定义内部的做法都使问题得到了解决,所以再次表示感谢!
但是这让我很郁闷,难道大名鼎鼎的微软出品的vc++编译器不值得信任么?
hellodudu 2008-04-03
  • 打赏
  • 举报
回复
把mytime.cpp内容放到mytime0.h中试试
hellodudu 2008-04-03
  • 打赏
  • 举报
回复
我用dev-c++编译没问题啊
lz试试把类的实现文件和头文件放一起
taodm 2008-04-03
  • 打赏
  • 举报
回复
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int hr,int min = 0);
void addmin(int min);
void addhr(int hr);
void reset(int hr = 0,int min = 0);
Time sum(const Time & t);
Time operator+(const Time & t);
Time operator-(const Time & t);
Time operator*(unsigned int n);
friend Time operator*(unsigned int n,Time & t){return t * n;}
void show()const;
friend ostream & operator<<(ostream & os,const Time & t)
{
os<<"it's "<<t.hours<<" hour(s),"<<t.minutes<<" minute(s)"<<endl;//错误行,咋回事阿??
return os;
}

};
WingForce 2008-04-03
  • 打赏
  • 举报
回复
VC 6.0中要定义友元函数时要用头文件 #include <iostream.h> 代替 #include <iostream> using namespace std;
Inhibitory 2008-04-03
  • 打赏
  • 举报
回复
没有用VC,没遇到过这个问题,换个环境编译试试, VC如果没有升级到SP6的话,对C++标准支持不太好.
effective_person 2008-04-03
  • 打赏
  • 举报
回复
呵呵。
你应该用的vc6.0
vc6.0 不支持标准的c++
可以这样改
头文件#include <iostream>
using namespace std;
改成:
#include <iostream.h>
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-03 09:55
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下