C ++: Как построить таким образом отношения между srtucts? - PullRequest
3 голосов
/ 20 марта 2020

Я новичок в c +, я работаю над проектом: «Система управления образованием». Мне было трудно и трудно, когда я пришел к тому, чтобы расстаться с отношениями кода между объектами и способом их доступа друг к другу, так что это мой подход:

struct doctor
{
    person info;
    vector <course> courses;
};

struct student
{
    person info;
    vector <course> courses;
    vector <assignmentSolution> assignmentSolutions;
};

struct course
{
    int code;
    string title;
    doctor lecturer;
    vector <student> registeredStudents;
    vector <assignment> assignments;
};


vector <doctor> doctors;
vector <student> students;
vector <course> courses;

Таким образом, врачи будут создавать курс по:

courses.push_back(newCourse);
doctors[index].courses.push_back(newCourse);

Это неправильно, но мне интересно, как создать его только один раз в памяти, но имейте в виду, что студент будет записываться на курсы после этого.

1 Ответ

1 голос
/ 20 марта 2020

Возможно, вы немного перегружены, но, используя шаблон посетителей, вы можете сделать систему курсов расширяемой: в основном, у вас есть школьный класс, которому принадлежат курсы. Там участники школы могут зарегистрироваться, позвонив registerMember (код, участник). Сами курсы не являются собственниками школы, только указатели на них

#include <map>
#include <memory>
#include <string>
#include <vector>

struct Course;
struct School;

struct Person {
  std::string name;
  int age;
};

struct SchoolMember {
  Person info;  // composition unless person has functionality that SchoolMember
                // needs
  std::vector<Course*> courses;  // maybe map for easier deletion
  School* school;

  virtual ~SchoolMember() {}
  virtual void visit(Course* course) = 0;
};

struct Student;
struct Doctor;

struct Course {
  int code;
  std::string title;
  Doctor* mainDoctor;
  std::vector<Student*> students;

  virtual ~Course() {}

  virtual void accept(Student* student) = 0;
  virtual void accept(Doctor* doctor) = 0;

  virtual void cleanUp() {
    // remove me from student'S lists etc.
  }
};

struct Student final : SchoolMember {
  void visit(Course* course) override {
    courses.emplace_back(course);
    course->accept(this);
    // additional stuff
  }
};

struct Doctor final : SchoolMember {
  void visit(Course* course) override {
    courses.emplace_back(course);
    course->accept(this);
    // additional stuff
  }
};

struct Course101 final : Course {
  void accept(Student* student) {
    // Reject advanced students, etc.
    students.emplace_back(student);
  }
  void accept(Doctor* doctor) {
    // Replace current doctor
  }
};

struct CourseAdvanced final : Course {
  Doctor* secondaryDoctor;

  void accept(Student* student) {
    // Reject 101 students, etc.
    students.emplace_back(student);
  }
  void accept(Doctor* doctor) {
    // I can have multiple doctors!

  }
};

struct School {
  std::map<int, std::unique_ptr<Course>> courses; // School owns the courses

  void addCourse(int code /**/) {
    // create new course
  }

  void registerMember(int code, SchoolMember* member) {
    if(auto it = courses.find(code); it != courses.end()) {
      member->visit(it->second.get());
    }
  }

  void removeCourse(int code) {
    if(auto it = courses.find(code); it != courses.end()) {
      it->second->cleanUp();
      courses.erase(it);
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...