有关友元的几个问题?
我想用友元实现下一个功能:
Teacher 类和Student类中Teacher需要访问学生的成绩,比如语文老师要修改学生的语文成绩
class Teacher class Student
{
private:
char sno[5];
unsigned int score1;
unsigned int score2;
unsigned int score3;
}
{
private:
char tno[5];
char tname[20];
char TeacherType[5];
}请问如何实现友元函数modifyStudent,使得一个老师只能修改学生的一个成绩。最好能有代码.
题目二:
Ostream &operator <<(POINT &pt)
{
cout<<pt.x<<endl;
cout<<pt.y<<endl;
return (OStream(cout));//调用默认拷贝构造函数
}
这段代码实现<<的重载请问对吗?如果不对请帮我改一改。
class POINT
{ private:
int x;
int y;
public:
friend Ostream& Ostream::operator <<(POINT &pt);
}
问题点数:50、回复次数:21Top
1 楼jobs002(Oh! Office)回复于 2006-03-04 08:25:24 得分 0
只能我自己顶了......Top
2 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-04 08:41:05 得分 8
2.
ostream &operator <<(ostream& os, POINT &pt)
{
cout<<pt.x<<endl;
cout<<pt.y<<endl;
return os;
}
Top
3 楼jobs002(Oh! Office)回复于 2006-03-04 08:44:09 得分 0
我认为是:
cout<<pt//POINT pt;
cout.operator <<( POINT& pt)Top
4 楼rabbit729(无名胜有名)回复于 2006-03-04 09:07:43 得分 0
个人认为:第一个问题:我认为这个要求根本没必要利用友元函数来实现,就在student类中分别为三个成绩各自定义一个修改成绩的函数就可以了。第二个问题:windywater 的回答完全正确!Top
5 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-04 09:17:37 得分 0
楼主的意思是,只有老师能修改相应的成绩,而学生自己没有这个权力,所以不能定义在学生类里。我们现在数据结构都没学,更别谈设计模式了,等高手来解答吧,帮顶一下。Top
6 楼jobs002(Oh! Office)回复于 2006-03-04 09:19:15 得分 0
第一个问题,学生的成绩不能随便修改,如果定义为成员函数,那么在main中随便调用一下就能修改,那怎么可能,只能教师能够修改学生的成绩。
第二个问题,<<重载int的函数模型 Ostream & operator(int)
我想修改一下库的函数,那么我的那个错误了没有??请详细解答,如果错误,为什么??Top
7 楼theory88(伟)回复于 2006-03-04 09:33:52 得分 10
class Student;
class Teacher
{
private:
char tno[5];
char tname[20];
char TeacherType[5];
public:
void modifyStudent(Student& st, int score);
}
class Student
{
private:
char sno[5];
unsigned int score1;
unsigned int score2;
unsigned int score3;
public:
friend void Teacher::modifyStudent(Student& st, int score);
}
void Teacher::modifyStudent(Student& st, int score)
{
switch(this.TeacherType)
{
case course1: st.score1 = score; break;
case course2: st.score2 = score; break;
case course3: st.score3 = score; break;
default: break;
}
}
第二个问题 windywater 的回答完全正确!Top
8 楼jobs002(Oh! Office)回复于 2006-03-04 09:49:27 得分 0
第二个问题我的对不对?如果错误,错在什么地方??详细解释一下Top
9 楼njSeeWhy(北海鲲鹏)回复于 2006-03-04 10:18:02 得分 0
对于楼主的第一个问题,大家似乎有一个概念没弄清:类本身和类的使用者是两个不同的实体。并不是说Teacher类可以修改Student的成绩就意味着老师能改成绩而学生不能改。要知道,成绩是Student类的私有数据,按照各位的逻辑,那么学生是最能够修改自己成绩的,而且改了还可以让其他人都不知道,因为成绩是他自己私有的,呵呵。因此,我觉得从类的设计上来说,给Student类增加修改成绩的公共方法并没有错,关键是Student类应该暴露给谁来用。比如,只有那些应该知道学生信息的类,比如Teacher,才能看到Student类(通过包含相应的头文件),这样应该就可以实现楼主想要的效果了。Top
10 楼jobs002(Oh! Office)回复于 2006-03-04 10:50:43 得分 0
再顶一顶,还是第二个问题
Top
11 楼zh2817()回复于 2006-03-04 10:51:53 得分 8
1.
除了一般的函数可以作为某个类的友元外,一个类的成员函数也可以作为另一个类的友元函数,这样该友元的成员函数不但可以访问自己所在类的成员,还可以访问其他类中的成员。
既然Teacher 类和Student类中Teacher需要访问学生的成绩,比如语文老师要修改学生的语文成绩:就得添加变量a、b、c来存储某科老师的变量,对theory88的做点修改:
class Student;
class Teacher
{
private:
char tno[5];
char tname[20];
char TeacherType[5];
int a,b,c;
public:
void modifyStudent(Student&);
};
class Student
{
private:
char sno[5];
unsigned int score1;
unsigned int score2;
unsigned int score3;
public:
friend void Teacher::modifyStudent(Student&);
};
void Teacher::modifyStudent(Student &int score)
{
a = score.score1;
b = score.score2;
c = score.score3;
}
2.
ostream &operator <<(ostream& os, POINT &pt)
{
cout<<pt.x<<endl;
cout<<pt.y<<endl;
return os;
}
Top
12 楼waxic(waxic)回复于 2006-03-04 10:52:14 得分 0
Ostream &operator <<(ostream & os, POINT &pt)
{
os<<pt.x<<endl;
os<<pt.y<<endl;
return os;
}
Top
13 楼willingbupt(buptcsdn)回复于 2006-03-04 11:25:53 得分 7
both of tow are right
1.ostream &operator <<(ostream& os, POINT &pt)
{
cout<<pt.x<<endl;
cout<<pt.y<<endl;
return os;
}
2.ostream &operator <<(ostream & os, POINT &pt)
{
os<<pt.x<<endl;
os<<pt.y<<endl;
return os;
}
Top
14 楼jobs002(Oh! Office)回复于 2006-03-04 11:31:16 得分 0
Ostream &operator <<(POINT &pt)
{
cout<<pt.x<<endl;
cout<<pt.y<<endl;
return (OStream(cout));//调用默认拷贝构造函数
}
错在什么地方?Top
15 楼jobs002(Oh! Office)回复于 2006-03-04 16:39:43 得分 0
我现在想问这个问题,顶一个,第一个不讨论了Top
16 楼jobs002(Oh! Office)回复于 2006-03-05 09:23:35 得分 0
ostream &operator <<(ostream & os, POINT &pt)
{
os<<pt.x<<endl;
os<<pt.y<<endl;
return os;
}
全局函数....
昨天看了看钱能的书,p430,因为ostream类在头文件iostream.h头文件定义,是标准类库,所以用户只能继承,不能修改标准类库,所以它更不能是ostream类的成员。请问标准类库为什么不能修改??Top
17 楼theory88(伟)回复于 2006-03-05 09:43:07 得分 0
类库是编译过的dll吧Top
18 楼wjd7623054(千古风流)回复于 2006-03-05 12:42:13 得分 0
看来我有好多的C++基础要补习Top
19 楼njSeeWhy(北海鲲鹏)回复于 2006-03-06 09:21:41 得分 12
输出流的操作符规定必须接受一个ostream&,并返回ostream&,这样才能连续地输出:
比如 cout<<a<<b<<c。C++规定,重载运算符不能修改运算符操作数的个数,所以楼主的定义是错误的。Top
20 楼Dugowe(我不是火星人,我家狗狗才是..)回复于 2006-03-06 09:55:05 得分 5
关于第一个问题
建议应用友元类 完全可以自己查书解决
第二个问题
那个宇宙。。。大白痴说得对
class POINT
{ private:
int x;
int y;
public:
friend ostream operator <<(ostream &os,const POINT &pt);
}
ostream &operator<<(ostream &os,const POINT &pt)
{
os<<POINT.st;
return os;
}
可以直接重载类的<<操作符Top
21 楼Dugowe(我不是火星人,我家狗狗才是..)回复于 2006-03-06 09:57:33 得分 0
关于第一个问题
建议应用友元类 完全可以自己查书解决
第二个问题
那个宇宙。。。大白痴说得对
class POINT
{ private:
int m_x;
int m_y;
public:
friend ostream operator << (ostream &os,const POINT &pt);
}
ostream &operator << (ostream &os,const POINT &pt) //overload <<
{
os<<POINT.st;
return os;
}
可以直接重载类的<<操作符
Top




