---
# System prepended metadata

title: School - Semester - Course - Student

---

# School - Semester - Course - Student
```cpp
#include<iostream>
#include<vector>
#include<string>
using namespace std;

class School;
class Semester;
class Course;
class Student;

class School{
private:
    string _name;
public:
    School(){
        _name = "The Umbrella Academy";
    }
    School(string name){
        _name = name;
    }
    
    ~School(){
        // Nothing to do here!!!
    }
    
    void print(){
        cout << "School name: " << _name << endl;
    }
};

class Semester{
private:
    string _name;
    School *_school;
public:
    Semester(){
        _name = "";
        _school = NULL;
    }
    Semester(string name, School * school){
        _name = name;
        _school = school;
    }
    ~Semester(){
        // pointer *_school is shared among object, do not delete here
    }
    void print(){
        cout << "Semester name: " << _name << endl;
        if(_school != NULL){
            _school->print();
        }
    }
};

class Course{
private:
    string _code;
    string _name;
    int _nStudents;
    int _maxStudents;
    Semester *_semester;
    
    // if you want to keep track of enrolled students, add a vector<Student*> here
    vector<Student*> _enrolledStudents;
public:
    Course(){
        _code = "";
        _name = "";
        _nStudents = 0;
        _maxStudents = 100;
        _semester = NULL;
    }
    Course(string code, string name, int maxStudents, Semester *semester){
        _code = code;
        _name = name;
        _nStudents = 0;
        _maxStudents = maxStudents;
        _semester = semester;
    }
    ~Course(){
        // pointer *_semester is shared among object, do not delete here
    }
    void print(){
        cout << "Course code: " << _code << endl;
        cout << "Course name: " << _name << endl;
        cout << "Number of students: " << _nStudents << endl;
        cout << "Max number of students allowed: " << _maxStudents << endl;
        if(_semester != NULL){
            _semester->print();
        }
    }
    
    // if you want to keep track of enrolled students, add check function here
    bool isAllowedToEnroll(Student *student){
        if(_nStudents >= _maxStudents)
            return false;
        else
            return true;
    }
    
    string getCode(){
        return _code;
    }
    
    bool enrollAStudent(Student *student){
        if(isAllowedToEnroll(student)){
            _enrolledStudents.push_back(student);
            _nStudents++;
            return true;
        }
        else{
            return false;
        }
    }
};

class Student{
private:
    string _code;
    string _name;
    School *_school;
    vector<Course*> _enrolledCourses;
public:
    Student(){
        _code = "";
        _name = "";
        _school = NULL;
    }
    Student(string code, string name, School *school){
        _code = code;
        _name = name;
        _school = school;
    }
    ~Student(){
        // Do not delete _school and _enrolledCourses[i]
    }
    void print(){
        cout << "Student code: " << _code << endl;
        cout << "Student name: " << _name << endl;
        if(_school != NULL){
            _school->print();
        }
        cout << "Number of enrolled courses: " << _enrolledCourses.size() << endl;
        for(int i = 0; i < _enrolledCourses.size(); i++){
            _enrolledCourses[i]->print();
        }
    }
    
    void enrollACourse(Course *course){
        bool hasEnrolled = false;
        for(int i = 0; i < _enrolledCourses.size(); i++){
            if(_enrolledCourses[i]->getCode() == course->getCode()){
                hasEnrolled = true;
            }
        }
        
        if(hasEnrolled == false){
            bool ans = course->enrollAStudent(this);
            if(ans){
                _enrolledCourses.push_back(course);
                cout << "Enroll successfully" << endl;
            }
            else{
                cout << "Enroll failed" << endl;
            }
        }
        else{
            cout << "Enroll failed" << endl;
        }
    }
};

int main(){
    School *hcmus = new School("VNU-HCMUS");
    Semester *summer2019 = new Semester("Summer 2019", hcmus);
    
    Course* oop = new Course("CTT006", "OOP", 100, summer2019);
    Course* integral2 = new Course("MTH00006", "Integral 2", 90, summer2019);
    Course* linear = new Course("MTH00008", "Linear Algebra", 80, summer2019);
    Course* physics1 = new Course("PHY00005", "Physics 1", 70, summer2019);
    
    Student *htthanh = new Student("18127001", "Ho Tuan Thanh", hcmus);
    htthanh->enrollACourse(oop); // allowed
    htthanh->enrollACourse(integral2); // allowed
    htthanh->enrollACourse(physics1); // allowed
    htthanh->enrollACourse(integral2); // not allowed, has enrolled
    
    Student *nkhuy = new Student("18127002", "Nguyen Khac Huy", hcmus);
    nkhuy->enrollACourse(oop); // allowed
    nkhuy->enrollACourse(linear); // allowed
    nkhuy->enrollACourse(integral2); // allowed
    nkhuy->enrollACourse(physics1); // allowed
    nkhuy->enrollACourse(oop); // not allowed, has enrolled
    
    delete htthanh;
    delete nkhuy;
    
    delete physics1;
    delete linear;
    delete integral2;
    delete oop;
    
    delete summer2019;
    delete hcmus;
    
    return 0;
}
```