1.关联关系 相比 组合关系,不那么紧密,可有可无,一般以球队队员为例子,说明这种关联关系,有时候也称为 聚合关系
2.2个类的相互引用 会 产生不完全类 具体见其他文章
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
class Stu;
class Cla; //先声明这两个类
//(1)定义学生Stu类
class Stu
{
public:
//姓名 和 学号直接public就好了
string name;
int number;
vector<Cla*> choose_class;
//构造函数
Stu(string name_, int number_) :name(name_), number(number_) {};
//还要写关于指针的容器,就用vector好了
//选课函数
void choose(Cla* cla)
{
choose_class.push_back(cla);
}
//返回总学分 --涉及到2个类的相互引用的问题,会产生不完全类,所以 考虑使用友元函数
//void total_grade()
//{
// cout << "学生 " << this->name << " 总共选课学分为 :" << endl;
// int total = 0;
// for (auto it = choose_class.begin(); it != choose_class.end(); it++)
// {
// //total += (*it)->grade;
// }
// total+=choose_class[0]->grade;
// cout << total << endl;
// //return total;
//}
};
class Cla
{
friend void total_grade();
public:
//课程名称,编号,学分--直接public属性
string name;
string number;
int grade; //学分
vector<Stu*> stu_in;
//构造函数
Cla(string name_, string number_, int grade_) :grade(grade_), name(name_),number(number_) {};
//有学生加入这门课
void new_stu(Stu* new_one)
{
stu_in.push_back(new_one);
cout << "学生 " << new_one->name << " 选择了课程: " << this->name << endl;
}
//输出所有学生的姓名
void show()
{
cout << "选择了"<< this->name<<"这门课的学生有:" << endl;
for (auto it = stu_in.begin(); it != stu_in.end(); it++)
{
cout << (*it)->name << endl;
}
}
};
//选课函数
void choose_func(Stu* stu, Cla* cla)
{
stu->choose(cla);
cla->new_stu(stu);
}
//友元函数--计算总学分
void total_grade(Stu* stu)
{
cout << "学生 " << stu->name << " 总共选课学分为 :" << endl;
int total = 0;
for (auto it = stu->choose_class.begin(); it != stu->choose_class.end(); it++)
{
total += (*it)->grade;
}
cout << total << endl;
//return total;
}
int main()
{
//测试:模拟学生选课
//可以利用 给课程进行编号,然后利用 手动输入 进行判断
//这里直接固定的写了
//学生
Stu* stu1 = new Stu("刘备", 1314);
Stu* stu2 = new Stu("关云长", 1148);
Stu* stu3 = new Stu("赵子龙", 1210);
//课程:
Cla* cla1 = new Cla("离散数学", "Cs110", 4);
Cla* cla2 = new Cla("C++", "CS120", 4);
Cla* cla3 = new Cla("数字电路", "Cs001", 4);
//学生选课--调用选课函数--同时影响到两个对象:学生和 课程
choose_func(stu1, cla1);
choose_func(stu1, cla2);
choose_func(stu2, cla3);
choose_func(stu3, cla2);
choose_func(stu3, cla3);
//打印C++课程的选课名单
cla2->show();
//打印一名学生的 选课 总学分
//cout << stu3->total_grade() << endl;
//cout << cla1->grade << endl;
total_grade(stu3);
return 0;
}