[디딤돌 C++] 44. 상속과 다형성 최종 실습 – 코드

상속과 다형성 최종 실습한 코드예요.

//StuConst.h
#pragma once
class StuConst
{
public:
    static const int def_iq;
    static const int max_iq;
    static const int min_iq;

    static const int def_hp;
    static const int max_hp;
    static const int min_hp;

    static const int def_stress;
    static const int max_stress;
    static const int min_stress;

    static const int def_scnt;
    static const int max_scnt;
    static const int min_scnt;
    
private://개체를 생성할 수 없게 함
    StuConst(void);    
};
//StuConst.cpp
#include "StuConst.h"
const int StuConst::def_iq = 100;
const int StuConst::max_iq=200;
const int StuConst::min_iq=0;
             
const int StuConst::def_hp=100;
const int StuConst::max_hp=200;
const int StuConst::min_hp=0;
             
const int StuConst::def_stress=0;
const int StuConst::max_stress=100;
const int StuConst::min_stress=0;
             
const int StuConst::def_scnt=0;
const int StuConst::max_scnt=5;
const int StuConst::min_scnt=0;

StuConst::StuConst(void)
{
}
//Student.h
#pragma once
#include "StuConst.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
    static int last_pn;
    const int pn;
    string name;
    int iq;
    int hp;
    int stress;
    int scnt;
public:
    Student(string name);
    virtual void Study()=0;
    virtual void ListenLecture()=0;
    virtual void Sleep()=0;
    virtual void Relax()=0;
    virtual void Drink()=0;
    virtual void Sing()=0;
    virtual void View()const;
    int GetPN()const;
    string GetName()const;
    int GetIQ()const;
    int GetHP()const;
    int GetStress()const;
    int GetSCnt()const;
protected:
    void SetIQ(int iq);
    void SetHP(int hp);
    void SetStress(int stress);
    void SetSCnt(int scnt);    
};
//Student.cpp
#include "Student.h"
#define SC StuConst //간략하게 사용할 수 있게 매크로 정의

int Student::last_pn;
Student::Student(string name):pn(++last_pn)
{
    this->name = name;
    SetIQ(SC::def_iq);
    SetHP(SC::def_hp);    
    SetStress(SC::def_stress);
    SetSCnt(SC::def_scnt);
}
void Student::View()const
{
    cout<<"주민 번호:"<<pn<<" 이름:"<<name<<endl;
    cout<<"  IQ:"<<iq<<" HP:"<<hp<<" Stress:"<<stress<<endl;
    cout<<"  연속으로 공부한 횟수:"<<scnt<<endl;
}
int Student::GetPN()const
{
    return pn;
}
string Student::GetName()const
{
    return name;
}
int Student::GetIQ()const
{
    return iq;
}
int Student::GetHP()const
{
    return hp;
}
int Student::GetStress()const
{
    return stress;
}
int Student::GetSCnt()const
{
    return scnt;
}

void Student::SetIQ(int iq)
{
    if(iq>SC::max_iq)
    {
        iq = SC::max_iq;
    }
    if(iq<SC::min_iq)
    {
        iq = SC::min_iq;
    }
    this->iq = iq;
}
void Student::SetHP(int hp)
{
    if(hp>SC::max_hp)
    {
        hp = SC::max_hp;
    }
    if(hp<SC::min_hp)
    {
        hp = SC::min_hp;
    }
    this->hp = hp;
}


void Student::SetStress(int stress)
{
    if(stress>SC::max_stress)
    {
        stress = SC::max_stress;
    }
    if(stress<SC::min_stress)
    {
        stress = SC::min_stress;
    }
    this->stress = stress;
}
void Student::SetSCnt(int scnt)
{
    if(scnt>SC::max_scnt)
    {
        scnt = SC::max_scnt;
    }
    if(scnt<SC::min_scnt)
    {
        scnt = SC::min_scnt;
    }
    this->scnt = scnt;
}
//SStudent.h
#pragma once
#include "student.h"
class SStudent :
    public Student
{
    int dummy;
    int total_scnt;
public:
    SStudent(string name);  
    virtual void Study();
    virtual void ListenLecture();
    virtual void Sleep();
    virtual void Relax();
    virtual void Drink();
    virtual void Sing();
    virtual void View()const;
    void Reading();
};
//SStudent..cpp
#include "SStudent.h"

SStudent::SStudent(string name):Student(name)
{
    dummy = 0;//더미 뇌는 생성 시 0
    total_scnt = 0;
}

void SStudent::Study()
{
    SetHP(GetHP()-5);//체력 5소모
    SetIQ(GetIQ()+GetSCnt()+dummy);//지력: scnt+더미 뇌 증가
    SetStress(GetStress()-2);//스트레스: 2감소
    SetSCnt(GetSCnt()+1);
    total_scnt++;

    if(total_scnt%5 == 0)//더미 뇌는 공부한 회수가 5의 배수가 될 때마다 1씩 증가
    {
        dummy++;
    }
}

void SStudent::ListenLecture()
{
    SetHP(GetHP()-3); //체력 3소모
    SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가
    SetStress(GetStress()+GetSCnt());// 스트레스: scnt증가
    SetSCnt(0);
}

void SStudent::Sleep()
{
    SetHP(GetHP()+10); //체력 10회복    
    SetStress(GetStress()-5); //스트레스: 5감소
    SetSCnt(0);
}
void SStudent::Relax()
{
    SetHP(GetHP()+3); //체력 3회복    
    SetStress(GetStress()-25); //스트레스: 25감소
    SetSCnt(0);
}
void SStudent::Drink()
{
    SetHP(GetHP()+5); //체력 5회복
    SetIQ(GetIQ()-10);//지력:  10감소
    SetStress(GetStress()+2);//스트레스: 2증가
    SetSCnt(0);    
}
void SStudent::Sing()
{
    SetHP(GetHP()-10); //체력 10 소모
    SetIQ(GetIQ()-(5-GetSCnt()));//지력: 5-scnt감소
    SetStress(GetStress()+(5-GetSCnt()));//스트레스: 5-scnt증가
    SetSCnt(0);    
}
void SStudent::View()const
{
    cout<<"학사 학생";
    Student::View();
    cout<<" 더미 뇌:"<<dummy<<"연속으로 공부한 횟수:"<<total_scnt<<endl;
}
void SStudent::Reading()
{
    dummy++;//더미 뇌 1증가
    SetStress(GetStress()-5);//스트레스: 5감소
}
//MStudent.h
#pragma once
#include "student.h"
class MStudent :
    public Student
{
    int stick;
public:
    MStudent(string name);
    virtual void Study();
    virtual void ListenLecture();
    virtual void Sleep();
    virtual void Relax();
    virtual void Drink();
    virtual void Sing();
    virtual void View()const;
    void Travel();
};
//MStudent.cpp
#include "MStudent.h"

MStudent::MStudent(string name):Student(name)
{
    stick=0;//지팡이는 생성 시 0
}

void MStudent::Study()
{    
    SetHP(GetHP()-3);//체력 3소모
    SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가
    SetStress(GetStress()+3);//스트레스: 3증가
    SetSCnt(GetSCnt()+1);    
}

void MStudent::ListenLecture()
{
    SetHP(GetHP()-2); //체력 2소모
    SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가
    SetStress(GetStress()+5);// 스트레스: 5증가
    SetSCnt(0);
}

void MStudent::Sleep()
{
    SetHP(GetHP()+10); //체력 10회복    
    SetStress(GetStress()-5); //스트레스: 5감소
    SetSCnt(0);
}
void MStudent::Relax()
{
    SetHP(GetHP()+3); //체력 3회복    
    SetStress(GetStress()-25); //스트레스: 25감소
    SetSCnt(0);
}
void MStudent::Drink()
{
    SetHP(GetHP()+5+stick); //체력 5+지팡이 회복
    SetIQ(GetIQ()-(10-stick));//지력:  10-지팡이 감소
    SetStress(GetStress()-2);//스트레스: 2감소
    SetSCnt(0);    
}
void MStudent::Sing()
{
    SetHP(GetHP()-(10-stick)); //체력 10-지팡이 소모
    SetIQ(GetIQ()-5);//지력: 5감소
    SetStress(GetStress()-5);//스트레스: 5감소
    SetSCnt(0);    
}
void MStudent::View()const
{
    cout<<"마법 학생";
    Student::View();
    cout<<" 지팡이:"<<stick<<endl;
}
void MStudent::Travel()
{
    stick++;//지팡이 1증가    
}
//PStudent.h
#pragma once
#include "student.h"
class PStudent :
    public Student
{
    int air;
public:
    PStudent(string name);
    virtual void Study();
    virtual void ListenLecture();
    virtual void Sleep();
    virtual void Relax();
    virtual void Drink();
    virtual void Sing();
    virtual void View()const;
    void Dance();
};
//PStudent..cpp
#include "PStudent.h" 
PStudent::PStudent(string name):Student(name)
{
    air=0;//air는 생성 시 0
}
void PStudent::Study()
{    
    SetHP(GetHP()-2);//체력 2소모
    SetIQ(GetIQ()+GetSCnt()/2);//지력: scnt/2 증가
    air-=3;
    SetStress(GetStress()-air*3);//스트레스: air*3감소
    SetSCnt(GetSCnt()+1);    
}
void PStudent::ListenLecture()
{
    SetHP(GetHP()-1); //체력 1소모
    SetIQ(GetIQ()+GetSCnt()/2);//지력: scnt/2 증가
    air-=5;
    SetStress(GetStress()-air*3);// 스트레스: air*3 감소
    SetSCnt(0);
}
void PStudent::Sleep()
{
    SetHP(GetHP()+10); //체력 10회복    
    SetStress(GetStress()-5); //스트레스: 5감소
    SetSCnt(0);
}
void PStudent::Relax()
{
    SetHP(GetHP()+8); //체력 8회복    
    SetStress(GetStress()-25); //스트레스: 25감소
    SetSCnt(0);
}
void PStudent::Drink()
{

    SetHP(GetHP()+5); //체력 5 회복
    SetIQ(GetIQ()-3);//지력:  3 감소
    SetStress(GetStress()-2);//스트레스: 2감소
    SetSCnt(0);    
}
void PStudent::Sing()
{
    SetHP(GetHP()-5); //체력 5 소모
    SetIQ(GetIQ()+2);//지력: 5증가
    SetStress(GetStress()-5);//스트레스: 5감소
    SetSCnt(0);    
}
void PStudent::View()const
{
    cout<<"운동 학생";
    Student::View();
    cout<<" air:"<<air<<endl;
}
void PStudent::Dance()
{    
    SetHP(GetHP()-5); //체력 5 소모
    SetIQ(GetIQ()+3);//지력: 3증가
    air++;//air 1증가    
}
//Program.cpp
#include "SStudent.h"
#include "MStudent.h"
#include "PStudent.h"

int main()
{
    Student *stues[3];
    stues[0] = new SStudent("공부 좋아");
    stues[1] = new PStudent("운동 잘해");
    stues[2] = new MStudent("빠쥬따꾸");

    cout<<"강의"<<endl;
    for(int i = 0; i<3; i++)
    {
        stues[i]->ListenLecture();
        stues[i]->View();
    }

    cout<<"자습"<<endl;
    for(int i = 0; i<3; i++)
    {
        stues[i]->Study();
        SStudent *ss = dynamic_cast<SStudent *>(stues[i]);
        if(ss)
        {
            ss->Reading();
        }
        stues[i]->View();
    }    
    cout<<"소등"<<endl;
    for(int i = 0; i<3; i++)
    {
        stues[i]->Sleep();
        stues[i]->View();
    }
    cout<<"자유 시간"<<endl;
    for(int i = 0; i<3; i++)
    {
        stues[i]->Relax();
        MStudent *ms = dynamic_cast<MStudent *>(stues[i]);
        if(ms)
        {
            ms->Travel();
        }
        stues[i]->View();
    }    
    cout<<"파티"<<endl;
    for(int i = 0; i<3; i++)
    {
        stues[i]->Drink();
        stues[i]->View();
    }
    cout<<"노래방"<<endl;
    for(int i = 0; i<3; i++)
    {
        stues[i]->Sing();
        PStudent *ps = dynamic_cast<PStudent *>(stues[i]);
        if(ps)
        {
            ps->Dance();
        }
        stues[i]->View();
    } 
    for(int i = 0; i<3; i++)
    {
        delete stues[i];
    }
    return 0;
}

▷ 실행 결과

강의

학사 학생주민 번호:1 이름:공부 좋아

IQ:100 HP:97 Stress:0

연속으로 공부한 횟수:0

더미 뇌:0연속으로 공부한 횟수:0

운동 학생주민 번호:2 이름:운동 잘해

IQ:100 HP:99 Stress:15

연속으로 공부한 횟수:0

air:-5

마법 학생주민 번호:3 이름:빠쥬따꾸

IQ:100 HP:98 Stress:5

연속으로 공부한 횟수:0

지팡이:0

자습

학사 학생주민 번호:1 이름:공부 좋아

IQ:100 HP:92 Stress:0

연속으로 공부한 횟수:1

더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

IQ:100 HP:97 Stress:39

연속으로 공부한 횟수:1

air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

IQ:100 HP:95 Stress:8

연속으로 공부한 횟수:1

지팡이:0

소등

학사 학생주민 번호:1 이름:공부 좋아

IQ:100 HP:102 Stress:0

연속으로 공부한 횟수:0

더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

IQ:100 HP:107 Stress:34

연속으로 공부한 횟수:0

air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

IQ:100 HP:105 Stress:3

연속으로 공부한 횟수:0

지팡이:0

자유 시간

학사 학생주민 번호:1 이름:공부 좋아

IQ:100 HP:105 Stress:0

연속으로 공부한 횟수:0

더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

IQ:100 HP:115 Stress:9

연속으로 공부한 횟수:0

air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

IQ:100 HP:108 Stress:0

연속으로 공부한 횟수:0

지팡이:1

파티

학사 학생주민 번호:1 이름:공부 좋아

IQ:90 HP:110 Stress:2

연속으로 공부한 횟수:0

더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

IQ:97 HP:120 Stress:7

연속으로 공부한 횟수:0

air:-8

마법 학생주민 번호:3 이름:빠쥬따꾸

IQ:91 HP:114 Stress:0

연속으로 공부한 횟수:0

지팡이:1

노래방

학사 학생주민 번호:1 이름:공부 좋아

IQ:85 HP:100 Stress:7

연속으로 공부한 횟수:0

더미 뇌:1연속으로 공부한 횟수:1

운동 학생주민 번호:2 이름:운동 잘해

IQ:102 HP:110 Stress:2

연속으로 공부한 횟수:0

air:-7

마법 학생주민 번호:3 이름:빠쥬따꾸

IQ:86 HP:105 Stress:0

연속으로 공부한 횟수:0

지팡이:1