[디딤돌 C++] 78. 최종 실습 – 전체 보기

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

전체 보기에서는 이 에이치 나라에 있는 모든 학생 정보를 출력합니다. 그리고 모든 장소의 정보를 출력합니다. 각 장소에서는 해당 장소에 있는 모든 학생 정보를 출력합니다.

시퀀스 다이어그램

EhNara의 멤버 ViewAll 메서드를 구현합시다.

void EhNara::ViewAll() //전체 보기
{
전체 학생 정보 보기와 전체 장소 정보 보기 메서드를 만들어서 이를 호출하게 합시다.
    ViewStudents();//전체 학생 정보 보기
    ViewPlaces();//전체 장소 정보 보기
}

EHNara 클래스에 멤버 메서드 ViewStudents와 ViewPlaces를 추가하세요.

EhNara의 멤버 ViewStudents 메서드를 구현합시다.

void EhNara::ViewStudents()//전체 학생 정보 보기
{
먼저 학생 컬렉션에 보관한 학생 개체수를 얻어옵니다.
    size_t size = base.GetSize();//보관 개수를 얻어온다.
순차적으로 모든 학생 개체의 View 메서드를 호출합니다.
    for(size_t i = 0; i<size; ++i)//i를 0~size-1까지 증가
    {
        base[i]->View();//학생 정보 출력
    }
}

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

void EhNara::ViewPlaces()//전체 장소 정보 보기
{
순차적으로 모든 장소의 View 메서드를 호출하세요.
    for(int i = 0; i<PI_MAX; i++)
    {
        places[i]->View();//장소 정보 출력
    }
}

Place 클래스에 View 메서드를 선언하세요. 각 장소에 따라 어떤 장소인지를 출력하기 위해 가상 메서드로 정의해야겠죠.

class Place
{
    ...중략...
public:
    ...중략...
    virtual void View();//장소 정보 출력
    ...중략...
};

Place에 View 메서드를 구현합시다.

void Place::View()//장소 정보 출력
{
장소에 관계없이 해당 장소에 있는 모든 학생 정보를 출력해 주어야겠죠. 이 부분은 EhNara의 ViewStudents 메서드와 같습니다.
    size_t size = base.GetSize();//보관 개수를 얻어온다.
    for(size_t i = 0; i<size; ++i)//i를 0~size-1까지 증가
    {
        base[i]->View();//학생 정보 출력
    }
}

이제 각 장소의 View 메서드를 재정의합시다. 물론 클래스에 선언문을 추가해야 합니다.

class School :
    public Place
{
    ...중략...
public:
    ...중략...
    virtual void View();//장소 정보 출력
    ...중략...
};

소스 코드에 구체적으로 구현하세요.

void School::View()//장소 정보 출력
{
    cout<<"학교 "<<endl;
    Place::View();
}

주거지와 다운타운에도 같은 방법으로 구현하세요. 코드는 생략할게요.

이제 컴파일 및 빌드하고 테스트 해 보세요.