[C++] 벡터를 사용해서 출석부만들기

2022. 6. 14. 21:17코딩 1막 <C++개념편>/코딩 1막 <C++응용편>

728x90
#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct SchoolMember
{
    string name;
    int id;

    SchoolMember()
    {

    }
    SchoolMember(string _name, int _id)
    {
        name = _name;
        id = _id;
    }

    //virtual 가상함수
    //자식에서 재정의 된 함수가 있다면 자식의 함수를 실행
    void virtual ShowInfo()
    {
        cout << "교내멤버 정보출력" << endl;
        cout << name << id << endl;
    }


    //가상소멸자가 있어야 동적할당한 메모리 해제할때 자식의 소멸자도 수행
    virtual ~SchoolMember()
    {
        cout << "교내멤버 소멸자" << endl;
    }
};


struct Teacher : SchoolMember
{
    string subject;

    void ShowInfo()
    {
        cout << "선생 정보출력" << endl;
        cout << name << id << subject << endl;
    }

    Teacher()
    {

    }
    Teacher(string _name, int _id, string _subject) : SchoolMember(_name, _id)
    {
        subject = _subject;
    }

    ~Teacher()
    {
        cout << "선생 소멸자" << endl;
    }
};


struct Student : SchoolMember
{
    int grade;

    void ShowInfo()
    {
        cout << "학생 정보출력" << endl;
        cout << name << id << grade << endl;
    }

    Student()
    {

    }
    Student(string _name, int _id, int _grade) : SchoolMember(_name, _id)
    {
        grade = _grade;
    }

    ~Student()
    {
        cout << "학생 소멸자" << endl;
    }
};

struct SchoolClass
{
    vector<SchoolMember*> classMembers;
    Teacher* classTeacher = nullptr;
    int studentCount = 0;

    void AddTeacher()
    {
        //nullptr은 포인터변수가 아무것도 가르키고 있지않다는 뜻으로 통용됨
        //따라서 해당 if문은 classTeacher가 비어있지 않을 때를 말함.
        if (classTeacher != nullptr)
        {
            cout << classTeacher->name << "담당선생님이 이미 존재합니다" << endl;
            return;
        }

        Teacher* tempPtr = new Teacher;
        cout << "담임 선생의 이름을 입력하세요 : " << endl;
        cin >> tempPtr->name;
        tempPtr->id = 0;
        cout << "담당할 과목을 입력하세요 : " << endl;
        cin >> tempPtr->subject;

        classTeacher = tempPtr;
        //선생은 보통 반의 최상단에 위치하므로 push_back이 아닌 
        //insert를 통해 처음 위치에 추가해줌.
        classMembers.insert(classMembers.begin(), classTeacher);
    }

    void AddStudent(int num)
    {
        for (int i = 0; i < num; i++)
        {
            classMembers.push_back(new Student("학생", studentCount, 1));
            studentCount++;
        }
    }

    void PrintAttendance()
    {
        cout << "-------출석부------" << endl;
        for (int i = 0; i < classMembers.size(); i++)
        {
            classMembers[i]->ShowInfo();
        }
        cout << "-------------------" << endl;
    }

    void StartStudy()
    {
        if (classTeacher == nullptr)
        {
            cout << "선생님이 없어서 수업을 못합니다" << endl;
            return;
        }
        for (int i = 1; i < classMembers.size(); i++)
        {
            ((Student*)classMembers[i])->grade += 1;
        }
    }

    ~SchoolClass()
    {
        for (int i = 0; i < classMembers.size(); i++)
        {
            delete classMembers[i];
        }
    }
};


void main()
{

    SchoolClass firstClass;
    firstClass.AddTeacher();
    firstClass.AddStudent(10);
    firstClass.PrintAttendance();
    firstClass.AddTeacher();

}

출력 결과

728x90