C++友元类的使用
题目要求:教师类作为学生类的友元类,操作学生的学分和总成绩。
思路分析:教师类作为学生类的友元类,所以包含:
class student{
friend class teacher;
};
教师类的设计,包含教师可以给学生增加学分和增加成绩,而且由于教师类是学生类的友元,所以教师类在访问学生类的时候可以直接通过student.name的形式来访问学生的所有成员变量(包括私有的),不用在学生类中添加成员函数来获得值或者修改值。
学生类:
class student{
friend class teacher;
private:
string m_name;
int m_fen;
int m_mark;
public:
void show();
void SetName(string name);
student(string name="xxx",int fen=0,int mark=0);
string GetName();
};
教师类:
class teacher{
private:
string m_name;
public:
void Name(string name);
void SetFen(student &p,int fen);
void SetMark(student &p,int mark);
teacher(string name="x");
string GetName();
};
具体代码:
#include<iostream>
#include<string>
using namespace std;
class student{
friend class teacher;
private:
string m_name;
int m_fen;
int m_mark;
public:
void show();
void SetName(string name);
student(string name="xxx",int fen=0,int mark=0);
string GetName();
};
class teacher{
private:
string m_name;
public:
void Name(string name);
void SetFen(student &p,int fen);
void SetMark(student &p,int mark);
teacher(string name="x");
string GetName();
};
void student::show(){
cout<<"姓名:"<<this->m_name<<"学分:"<<m_fen<<"成绩:"<<m_mark<<endl;
}
void student::SetName(string name){
this->m_name=name;
}
student::student(string name,int fen,int mark){
this->m_name=name;
this->m_fen=fen;
this->m_mark=mark;
}
string student::GetName(){
return this->m_name;
}
teacher::teacher(string name){
this->m_name=name;
}
string teacher::GetName(){
return this->m_name;
}
void teacher::SetFen(student &p,int fen){
p.m_fen=fen;
cout<<"教师"<<this->m_name<<"给学生"<<p.m_name<<"增加学分,操作成功"<<endl;
}
void teacher::SetMark(student &p,int mark){
p.m_mark=mark;
cout<<"教师"<<this->m_name<<"给学生"<<p.m_name<<"增加成绩,操作成功"<<endl;
}
void teacher::Name(string name){
this->m_name=name;
}
int main(){
string n;
int i,j,M,N;
cout<<"您需要建立几位学生和几位老师:";
cin>>M>>N;
student stu[M];teacher teach[N];
cout<<"请输入"<<M<<"位学生的姓名:";
for(int i=0;i<M;i++){
string n;
cin>>n;
stu[i].SetName(n);
}
cout<<"请输入"<<N<<"位老师的姓名:";
for(int i=0;i<N;i++){
string n;
cin>>n;
teach[i].Name(n);
}
bool flag=true;
while(flag){
cout<<"请选择一位教师:";
cin>>n;
for(i=0;i<N;i++){
if(n==teach[i].GetName())break;
}
cout<<"请选择一位学生:";
cin>>n;
for(j=0;j<M;j++){
if(n==stu[j].GetName())break;
}
int fen,mark;
cout<<"请输入要增加的学分:";cin>>fen;
teach[i].SetFen(stu[j],fen);
cout<<"请输入要增加的总成绩:";cin>>mark;
teach[i].SetMark(stu[j],mark);
cout<<"还要继续吗(Y/N)?"<<endl;
cin>>flag;
}
for(int i=0;i<M;i++)stu[i].show();
return 0;
}
运行截图:
注:部分学生的学分和成绩为0,是构造函数的默认值是0,可以修改为需要的。