关联关系,利用类的指针的容器作为成员,实现关联关系(以课程和学生类为例子,设计2个类的相互引用)

本文通过一个C++代码示例介绍了如何创建一个学生选课系统,涉及类的声明、定义、友元函数以及关联关系(聚合关系)的运用。在实现过程中,讨论了类的相互引用可能导致的不完全类问题,并通过友元函数解决计算总学分的难题。
摘要由CSDN通过智能技术生成

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值