이번에는 전체 보기 기능에 관해 시퀀스 다이어그램을 작성하고 난 후에 구체적인 코드를 구현합시다.
전체 보기에서는 이 에이치 나라에 있는 모든 학생 정보를 출력합니다. 그리고 모든 장소의 정보를 출력합니다. 각 장소에서는 해당 장소에 있는 모든 학생 정보를 출력합니다.
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(); }
주거지와 다운타운에도 같은 방법으로 구현하세요. 코드는 생략할게요.
이제 컴파일 및 빌드하고 테스트 해 보세요.