【问题标题】:How i can use inheritance我如何使用继承
【发布时间】:2019-09-20 16:32:22
【问题描述】:

我正在解决以下问题。但无法得到任何健康的逻辑。

1.学生人数。对于每个学生卷(唯一),都将存储姓名。对于每个主题,要存储主题代码和名称。学生可以选择科目数。系统应该能够维护学生列表、学科列表并且能够回答:i) 哪个学生选择了哪些学科和 ii) 一个学科谁是学生。

我尝试了一些逻辑,但现在我迷路了。谁能给我一点想法如何进行。 我是以正确的方式接近它还是你可以建议的任何其他好的方法。

#include <iostream>
#include <string.h>
class StudentDetails {
public:
    int roll;
    char name1[15];
};
class SubjectDetails : public StudentDetails {
public:
    SubjectDetails() = default;
    SubjectDetails(int n, string naam)
        : code(n)
        , name(naam)
    {
    }
    int code;
    string name2;
};
class Subject {
    SubjectDetails s1{ 1, "A" };
    SubjectDetails s2{ 2, "B" };
    SubjectDetails s3{ 3, "C" };
    SubjectDetails s4{ 4, "D" };
    SubjectDetails s5{ 5, "E" };
};
class Student {
public:
    Subject s[5]
};

【问题讨论】:

  • 为什么要使用继承?
  • 我还能做什么。有什么想法吗?
  • 经验法则:继承遵循“is-a”关系,组合(包含)遵循“has-a”规则。例如,Studenthas-a 名称; Student 不是名称,因此 Student 包含名称成员并且不继承名称类。
  • 使用std::string。它可以动态增长。字符数组是固定长度的,通常太大或太小。您必须重新分配数组以使其更大。与数组和std::vector类似。
  • 组织数据的方法有很多种。例如,您可以根据Database Normal Forms 制作单独的表格。

标签: c++ class oop inheritance


【解决方案1】:

您可能会遇到问题,因为这不是使用继承的好方法。继承在两个对象之间建立Is-A relationship

推荐阅读:Liskov Substitution Principle

在这种情况下,SubjectDetailsStudentDetails,并且必须可以在您使用 StudentDetails 的任何地方使用。如果你有一个StudentDetails 的列表,继承表示你可以在其中插入一个SubjectDetails

你想要的是Has-A relationship。一个学生有一门学科。一个主题有一个名字。一个主题有一个代码。在您的情况下,主题可以有许多名称和许多代码。从问题中的问题描述来看,

对于每个主题,要存储主题代码和名称。

我不认为这是有道理的。我建议删除SubjectDetails 并将其合并到Subject。旁注,任何时候你发现自己在制作顺序编号的变量,你可能真的想要一个数组。

class Subject {
public:
    Subject() = default;
    Subject(int n, string naam)
        : code(n)
        , name(naam)
    {
    }
    int code;
    string name;
};

同样,学生可能有很多名字,但应该只有一个卷。名称通常根据文化规范堆叠起来(例如,John Jacob Jingleheimer-Shmidt 将这些名称组合成一个更大的名称),因此 StudentDetails 也应合并为 Student 并丢弃。

class Student {
public:
    int roll;
    char name1[15];
    int number_subjects;
    Subject subjects[5]; // use descriptive names. s tells you nothing about the purpose 
                         // of the member, and this often slows debugging and reading
};

现在学生有卷、姓名和最多五个科目。如果最大主题数未知且允许在作业中使用vector,请考虑使用std::vector&lt;Subjects&gt; 而不是数组。它使跟踪主题的动态列表变得更加容易。

查找每个学生的科目很容易。 Student 对象通过 subjects 成员直接告诉您。

要找到某个学科的学生,您必须做一些工作。您可以在学生列表中搜索包含给定Subject 的所有Students,这是一个简单但缓慢的任务,或者您维护将Subjects 映射到Students 列表的第二个列表。映射表的查找速度非常快,但是在添加和删除学生和科目时保持映射表的完整性可能非常困难。

您选择哪一个取决于预期的访问模式(如果按科目查找学生很常见,而添加学生和科目不常见,则维护额外的科目->学生映射可能是一个重要的优化)、可用资源的数量,以及您完成作业的剩余时间。

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多