10.3 집합관계 aggregation
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";
}
}