在友元函数中不能访问私有变量??????
头文件
#ifndef MYTIME0_H_
#define MYTIME0_H_
#include<iostream>
using namespace std;
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h,int m);
void AddMin(int m);
void AddHr(int h);
void Reset(int h,int m);
Time operator+(const Time & t) const;
Time operator-(const Time & t) const;
Time operator*(double n) const;
//void show() const;
friend Time operator*(double m,const Time &t)
{ return t*m;}
friend ostream & operator<<(ostream & os,const Time & t);
};
#endif
类描述文件
#include "mytime0.h"
Time::Time()
{
hours=minutes=0;
}
Time::Time(int h,int m)
{
hours=h;
minutes=m;
}
void Time::AddMin(int m)
{
minutes += m;
hours +=minutes/60;
minutes %= 60;
}
void Time::AddHr(int h)
{
hours += h;
}
void Time::Reset(int h,int m)
{
hours=h;
minutes=m;
}
Time Time::operator+(const Time &t) const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes/60;
sum.minutes %= 60;
return sum;
}
Time Time::operator -(const Time & t) const
{
Time diff;
int tot1,tot2;
tot1 = t.minutes+60*t.hours;
tot2 = minutes+60*hours;
diff.minutes=(tot2-tot1)%60;
diff.hours=(tot2-tot1)/60;
return diff;
}
Time Time::operator *(double n) const
{
Time result;
long totalminutes = hours*n*60+minutes*n;
result.hours=totalminutes/60;
result.minutes=totalminutes%60;
return result;
}
ostream & operator<<(ostream & os, const Time & t)
{
os<<t.hours<<" hours, "<<t.minutes<<" minutes";
return os;
}
编译的时候提示在operator<<这个函数中不能访问Time类的私有成员.
error C2248: 'hours' : cannot access private member declared in class 'Time'
什么原因??
问题点数:5、回复次数:16Top
1 楼waxic(waxic)回复于 2006-03-03 19:59:55 得分 0
我是在vc中调试的,怎么没有人啊??Top
2 楼cunsh(村少)回复于 2006-03-03 20:08:05 得分 0
- 0 error(s), 0 warning(s)
vc++6Top
3 楼waxic(waxic)回复于 2006-03-03 20:11:22 得分 0
不会吧,楼上的,我怎么调试就有错误呢?我看程序也没错啊Top
4 楼willingbupt(buptcsdn)回复于 2006-03-03 20:39:36 得分 0
友元不属于任何类,应此不能访问私有成员是对的。Top
5 楼waxic(waxic)回复于 2006-03-03 20:43:33 得分 0
不是吧,定义友元函数不就是为了访问私有变量吗?Top
6 楼willingbupt(buptcsdn)回复于 2006-03-03 20:51:27 得分 0
但是这个程序中并没有什么错误。Top
7 楼waxic(waxic)回复于 2006-03-03 21:06:08 得分 0
但是怎么在vc中就是有错误?就是说在友元函数中不能访问私有变量Top
8 楼willingbupt(buptcsdn)回复于 2006-03-03 21:13:40 得分 0
友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
呵呵,不好意思。Top
9 楼waxic(waxic)回复于 2006-03-03 21:27:57 得分 0
我是要用友元对操作符进行重载,好象没错啊,怎么在vc中就有错呢?Top
10 楼waxic(waxic)回复于 2006-03-03 22:28:19 得分 0
好了,调通了Top
11 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-03-03 22:54:00 得分 0
我在VC6中遇到过,
当重载<< 操作符为类的友元,如果头文件用
#include<iostream>
using namespace std;
这种形式要报错,如果头文件用
#include<iostream.h>
这种形式就不会出错。据说是没打补丁。
http://community.csdn.net/Expert/topic/4564/4564466.xml?temp=.705517
Top
12 楼fiftymetre(50米深蓝)回复于 2006-03-03 22:55:26 得分 0
重载 的问题吧。Top
13 楼waxic(waxic)回复于 2006-03-04 10:55:24 得分 0
谢谢A_B_C黄瓜Top
14 楼rain81(石头)回复于 2006-03-04 11:32:03 得分 0
我也刚遇到了这个问题,程序和这个类似
但是我改成 #include<iostream.h>后,又出现了下面的问题
error LNK2001: unresolved external symbol _WinMain@16
Debug/exercise.exe : fatal error LNK1120: 1 unresolved externals
请大家帮忙看一下,到底是什么引起的这个错误!
谢谢!Top
15 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-03-04 13:22:36 得分 0
rain81(小磊):
你的工程建错了吧,连接程序找不到_WinMain .Top
16 楼rain81(石头)回复于 2006-03-05 22:20:44 得分 0
谢谢 A_B_C_ABC(黄瓜)
我调试好了!Top




