从实验1到课设的中自己的小理解(待更新)

http://www.yyycode.cn/index.php/2020/05/26/%e4%bb%8e%e5%ae%9e%e9%aa%8c1%e5%88%b0%e8%af%be%e8%ae%be%e7%9a%84%e4%b8%ad%e8%87%aa%e5%b7%b1%e7%9a%84%e5%b0%8f%e7%90%86%e8%a7%a3%e5%be%85%e6%9b%b4%e6%96%b0/


实验1要求:

使用类和对象开发一个可以对单个学生的课程进行管理的项目。可以增加备选课程,学生可以选择所修课程,输出某学期课程表,已修完课程的绩点,某学期算数平均成绩,某学期带学分权值的平均成绩。

理解:

  • 一个类就相当一个模子,比如学生类,里面包含学生的名字,性别,学号等等。当然,一个学生也有很多课,那么学生类里面应该要存着一个学生的所有课程。那么实例化一个对象的时候,他里面就包含这个类里的所有信息。

最好把课程作为学生类的子对象数组类型,或者子对象指针数组类型。这样我们要对一个学生的课进行操作时,比如选课,那么把相应课程的指针放到这个学生对象的vector里面,就能达到选课的操作了。

那再比如这个课程类,里面自然有一个课对象应该有的课程名称,地点,任课老师,学分等.那么我们实例化课程对象,然后把某课程对象的指针放到一个学生的vector<Course*>的数组里,就能达到选课的目的。

比如老师类,除了一个老师对象该有的名字外,我们还有一些老师特有的操作,比如说给学生打分,我们应该把这个功能放在哪呢?我刚开始为了方便,就在学生类写了这个操作,只不过不在操作界面给出这个接口,只是单纯隐藏看不见。然后sss老师说,这样接口还是写了,学生会操作的话就能通过这个接口给自己的成绩修改。那么我们安全起见,可以把打分的操作放在老师类或者课程类。那么问题来了,怎么通过老师对象或者课程对象修改一个学生的成绩呢?

我觉得在我目前这样零散学opp的情况下,这是一个难点。学生的成绩应该存在哪里呢?应该怎么去调用谁的函数去写呢?怎么写呢?又比如教师增加选课,这个功能应该怎么实现呢?

我觉得这几个问题有共同的特征,就是涉及一个类对另一个类的操作。比如老师类能操作学生类的成绩,老师类能操作新增课程类的课。

我们慢慢捋捋,先看看老师开新课这个功能。功能是老师的,我们可以在老师的成员函数里面写一个setcourse.那么一个函数,有其返回值和传递参数,这十分重要。可以在setcourse里面调用new 一个course对象,用Course类的构造函数,然后返回Course*,然后在主函数的同样存课程指针的vector里面push_back一个新的课程指针.从而达到增加课的目的。应该还有很多方法..目前没有很好的积累.(primer或许有或许没有.)

再看看老师给学生改成绩这个操作。成绩是学生的,操作是老师的。在学生类里面添加一个成绩的成员变量,当然这个变量要和学生选的课匹配。我们可以在之前的学生类存课程指针的vector<Course*>进行改进,可以把vector<NODE>这个NODE是一个结构体,里面可以一元课程指针,二元对应成绩。

然后对老师给学生设置成绩进行操作。A类对B类中的某个成员变量进行修改,我们可以让老师中有一个setgrades,它的传入参数是student*,也就是某个学生对象的指针,然后在通过指针去看看学生对象中有无选该老师的课,如果有,那么老师可以修改学生对象的私有成员.问题来了,这怎么操作呢?我们不想让学生有改成绩的成员函数,这怎么办呢?那么友元函数就登场了!( 要一个全局函数,而这个函数又要有访问这个类的功能 –某度).

“类可以允许其他类或者函数访问它的非公有成员,方法是让其他类或者函数成为它的友元“—primer 270页

那么我们让教师成为学生的友元,就可以更改学生的成绩了。那么这个问题暂时得到解决。以后应该会有更好的办法吧…

  • 一个类的私有成员,那么这个实例化的对象是不能进行此操作私有成员的。那么我们想操作的话通过对象调用公有的(pubilc)的成员函数,达到获取这个对象的私有成员的目的。 那如果数据成员是公有,直接就可以通过对象访问了

实验二要求:

在实验1的基础上,使用类的继承机制,开发一个可以对学生、老师及其课程进行管理的系统。具备如下功能:

    1) 创建多个学生、老师、课程对象,并设置有关属性。

    2)学生、老师继承共同基类——CPerson,学生类派生出本科生、研究生,允许在职学生存在(是老师,同时也是研究生),课程作为基类,派生出理论课(可以含课内实验)、实习实践课和毕业设计三种课程。

    3)要求学生可以选课,老师可以开课——选择上哪门课,一门课只能一个老师,课程可以设置相关属性。

    4)老师输出个人信息、课表外,可以为其所开课程的学生打成绩,可以输出课程的成绩单。

5)学生可以输出个人信息外,可以查成绩、绩点、课表等信息。

6)允许课程类对象公开课程名称、任课老师、上课时间、地点、学分等接口,但不允许课程类对象直接使用成员函数获取课程学生名单、成绩等信息。

五、实验步骤

  1. 创建项目,写好头文件和主函数,测试通过。
  2. 添加CPerson作为学生、老师的基类,派生出教师类、学生类,本科生、研究生;写一个CCourse作为基类,派生出理论课、毕业设计课、实践课类等课程。根据自己设计情况考虑是否写时间类。为完成实验要求,增加相应的成员变量和成员函数,需要考虑各成员作为变量、指针还是引用类型。
  3. 在主函数中直接定义多个老师对象、课程对象、学生对象.
  4. 完成如下操作:教师开课、学生选课、老师查自己课表、学生查自己课表、老师给所上课打成绩、学生查看成绩、绩点等。

理解:确实是在实验一的基础上进行更新迭代。但是我实验一感觉很难维护,就重写了.重写之后觉得很不面向对象。于是实验3雪上加霜..

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/106345731