Как я могу использовать наследование - PullRequest
0 голосов
/ 20 сентября 2019

Я работал над следующей проблемой.Но я не могу получить здоровую логику.

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

1 Ответ

2 голосов
/ 20 сентября 2019

Вероятно, у вас проблемы, потому что это не очень хороший способ использования наследования.Наследование устанавливает отношение Is-A между двумя объектами.

Рекомендуемое чтение: Принцип подстановки Лискова .

В этом случае SubjectDetails - это StudentDetails и должно использоваться в любом месте, где вы будете использовать StudentDetails.Если у вас есть список StudentDetails, наследование говорит, что вы можете вставить в него SubjectDetails.

То, что вы хотите - это отношение Has-A .Студент имеет-предмет.У субъекта есть имя.Субъект имеет код А-А.В вашем случае у субъекта может быть много имен и кодов.Из описания проблемы в вопросе:

Для каждого субъекта необходимо сохранить код и имя субъекта.

Я не верю, что это имеет смысл.Я предлагаю исключить SubjectDetails и включить его в Subject.Примечание: всякий раз, когда вы делаете переменные с последовательной нумерацией, вам, скорее всего, действительно нужен массив.

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

Аналогично у студентов может быть много имен, но у них должен быть только один бросок.Имена, как правило, составляются в соответствии с культурными нормами (например, Джон Джейкоб Джинглхаймер-Шмидт объединяет имена в одно большее имя), поэтому 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
};

Теперь у студентов есть списки, имена и до пяти предметов.Попробуйте использовать std::vector<Subjects> вместо массива, если максимальное количество объектов неизвестно и vector разрешено использовать в задании.Это значительно упрощает отслеживание динамического списка предметов.

Найти предметы на одного учащегося легко.Student объект прямо говорит вам с членом subjects.

Чтобы найти учеников по предмету, вам нужно выполнить какую-то работу.Либо вы ищите в списке студентов все Students, которые содержат заданное Subject, простое, но медленное задание, либо вы поддерживаете второй список, который отображает Subjects в список Students.Таблица сопоставления делает поиск очень быстрым, но поддержание целостности таблицы сопоставления при добавлении и удалении учащихся и предметов может быть очень трудным.

Выбор того, который вы выберете, зависит от ожидаемой схемы доступа (если поиск учащихся по предмету является обычным делом, а добавление учащихся и предметов - нет, поддержание дополнительного предмета -> отображение учащихся может быть важной оптимизацией), суммадоступных ресурсов и сколько у вас осталось времени для выполнения задания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...