[디딤돌 C++] 79. 최종 실습 – 학생 복귀

이번에는 학생 복귀 기능에 관해 시퀀스 다이어그램을 작성하고 난 후에 구체적인 코드를 구현합시다.

학생 복귀 보기에서는 장소에 있는 학생을 선택하여 IComeBack 개체를 이용하여 복귀하게 합니다. 이를 위해 장소에 있는 학생 중에 사용자가 입력한 PN과 일치하는 학생을 찾는 부분이 필요합니다.

시퀀스 다이어그램

먼저 IComeBack 인터페이스에 ComeBack 메서드를 약속하세요.

interface IComeBack
{
    virtual void ComeBack(Man *man)=0;
};

그리고 IComeBack 인터페이스에서 파생한 EhNara에 이를 재정의해야겠죠. 먼저 클래스에 메서드를 선언하세요.

class EhNara:public IComeBack
{
    ...중략...
public:
    ...중략...
    virtual void ComeBack(Man *man);//학생 복귀
    ...중략...
};

EhNara의 ComeBack 메서드를 구현합시다.

void EhNara::ComeBack(Man *man)//학생 복귀
{
학생 컬렉션은 Student * 형식 개체를 보관하므로 dynamic_cast를 이용하여 하향 캐스팅하세요.
    Student *stu = dynamic_cast<Student *>(man);

만약 하향 캐스팅 결과가 0이면 프로그램에 논리적 버그가 있은 것이므로 예외를 던져줍니다.
    if(stu == 0)
    {
        throw "Student 형식이 아닙니다.";
    }

학생은 순차보관하세요.
    base.PushBack(stu);//순차 보관
}

이제 Place의 ComeBackStu 메서드를 구현합시다.

void Place::ComeBackStu()//유닛 복귀
{

이동할 유닛을 선택부터 해야겠죠.

    Man *man = SelectMan();//이동할 유닛 선택
잘못 선택하였을 때는 이를 출력하고 메서드를 종료합니다.
    if(man == 0)
    {
        cout<<"잘못 선택하였습니다."<<endl;
        return;
    }

유닛을 장소에서 제거한 후에 학생을 복귀합니다.
    EraseMan(man);//유닛 제거
    ic.ComeBack(man);//학생 복귀    
}

유닛 선택 기능을 구현합시다. 이 부분은 EhNara의 학생 선택 기능과 같습니다.

Man *Place::SelectMan()//유닛 선택
{
먼저 선택할 학생의 주민번호를 입력받으세요.
    cout<<"선택할 학생의 주민번호:";
    int pn=0;
    cin>>pn;
보관한 학생 중에 입력한 주민번호와 일치하는 학생을 찾아 반환합니다.
    size_t size = base.GetSize();//보관한 학생 수 구하기
    for(size_t i=0;i<size;++i)
    {
        if(base[i]->GetPN() == pn)//학생 주민번호와 입력한 주민번호가 같을 때
        {
            return base[i];
        }
    }
만약 일치하는 학생을 발견하지 못하면 0을 반환합니다.
    return 0;
}

유닛을 제거하는 메서드를 구현합시다.

void Place::EraseMan(Man *man)//유닛 제거
{
학생 컬렉션에서 같은 학생을 찾아 컬렉션의 RemoveAt 메서드를 이용하여 개체를 지우세요.
    size_t size = base.GetSize();//보관한 학생 수 구하기
    for(size_t i=0;i<size;++i)
    {
        if(base[i]==man)//보관한 학생과 입력 인자로 받은 학생이 같을 때
        {
            base.RemoveAt(i);//해당 인덱스에 보관한 개체 지우기
            return;
        }
    }    
}