Вероятно, у вас проблемы, потому что это не очень хороший способ использования наследования.Наследование устанавливает отношение 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
.Таблица сопоставления делает поиск очень быстрым, но поддержание целостности таблицы сопоставления при добавлении и удалении учащихся и предметов может быть очень трудным.
Выбор того, который вы выберете, зависит от ожидаемой схемы доступа (если поиск учащихся по предмету является обычным делом, а добавление учащихся и предметов - нет, поддержание дополнительного предмета -> отображение учащихся может быть важной оптимизацией), суммадоступных ресурсов и сколько у вас осталось времени для выполнения задания.