Lecture header

#pragma once
#inlcude <string>

class Teacher
{
private:
    std::string m_name;
public:
    Teacher(const std::string & name_in = "No Name")
        : m_name(name_in)
    {}
    
    void setName(const std::string & name_in)
    {
        m_name = name_in;
    }
    
    std::string getName()
    {
        return m_name;
    }
    
    friend std::ostream & operator << (std::ostream & out, const Teacher & teacher)
    {
        out << teacher.m_name;
        return out;
    }
};

Student header

#pragma once

#include <iostream>
#include <string>

class Student
{
private:
    std::string m_name;
    int m_intel; //intelligence;
    
public:
    Student(const std::string & name_in = "No Name", const int & intel_in = 0)
        : m_name(name_in), m_intel(intel_in)
    {}
    
    void setName(const std::string & name_in)
    {
        m_name = name_in;
    }
    
    void setIntel(const int & intel_in)
    {
        m_intel = intel_in;
    }
    
    int getIntel()
    {
        return m_intel;
    }
    
    friend std::ostream & operator << (std::ostream & out, const Student & student)
    {
        out << studnet.m_name << " " << student.m_intel;
        return out;
    }
};

Lecture header

#pragma once

#include <vector>
#include "Student.h"
#include "Teacher.h"

class Lecture
{
private:
    std::string m_name;
    
    //Teacher teacher;
    //std::vector<Student> students; // 이렇게 하면 composition 관계이므로 lecture가 사라지면 teacher,student도 사라짐.
    Teacher* teacher;
    std::vector<Student*> students;
    
public:
    Lecture(const std::string & name_in)
        : m_name(name_in)
    {}
    
    ~Lecture()
    {
        // do NOT delete teacher
        // do Not delete students
    }
    
    void assignTeacher(Teacher * const teacher_input)
    {
        teacher = teacher_input;
    }
    
    void registerStudent(Student * const student_input)
    {
        students.push_back(student_input);
        // &student_input과 &students[0]이 다르다, 즉 주소가 서로 다르다. 그렇다면 Teacher의 주소, Student의 주소를 가져오면 된다.
    }
    
    void study()
    {
        std::cout << m_name << " Study " << "\n" << "\n";
        
        //for (auto & element : students) // auto element 는 값이 업데이트가 안된다.
        //    element.setIntel(element.getIntel() + 1);
        for (auto & element : students) // 이때는 auto element도 가능 
            (*element).setIntel((*element).getIntel() + 1);
    }
    
    friend std::ostream & operator << (std::ostream & out, const Lecture & lecture)
    {
        out << "Lecture name : " << lecture.m_name << "\n";
        
        out << lecture.(*teacher) << "\n";
        for (auto element : lecture.students)
            out << *element << "\n";
    }
};
#inlcude <iostream>
#include <vector>
#include <string>
#include "Lecture.h"

int main()
{
	using namespace std;
    
    Student std1("Jack Jack", 0);
    Student std2("Dash", 1);
    Student std3("Violet", 2);
    
    Teacher teacher1("Prof. Hong");
    Teacher teacher2("Prof. Good");
    
    // Composition Relationship
    Lecture lec1("Introduction to Computer Programming");
    //lec1.assignTeacher(Teacher("Prof. Hong"));
    //lec1.registerStudent(Student("Jack Jack", 0));
    //lec1.registerStudent(Student("Dash", 1));
    //lec1.registerStudent(Student("Violet", 2));
    lec1.assignTeacher(&teacher1);
    lec1.registerStudent(&std1);
    lec1.registerStudent(&std2);
    lec1.registerStudent(&std3);
    
    Lecture lec2("Computational Thinking");
    //lec2.assignTeacher(Teacher("Prof. Good"));
    //lec2.registerStudent(Student("Jack Jack", 0)); // lec1의 Jack Jack의 정보를 가져오고 싶다.
    lec2.assignTeacher(&teacher2);
    lec2.registerStudent(&std1); 
    
    //test
    {
        cout << lec1 << "\n";
        cout << lec2 << "\n";
        
        //event // lec2를 스터디하면 jack jack의 지능이 1 오르게 하고싶다.
        lec2.study();
        
        cout << lec1 << "\n";
        cout << lec2 << "\n";
    }
}