언어 자료구조 알고리즘/디딤돌 C++

[C++] 80. 최종 실습 - 강의 시작

언제나휴일 2016. 5. 1. 19:34
반응형

[C++] 80. 최종 실습 - 강의 시작


강의 시작

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

강의 시작 기능은 학교에 있는 모든 학생의 ListenLecture를 수행하게 합니다. 그런데 각 장소에서는 해당 장소에서 명령할 수 있는 기능만 보이게 한정하였기 때문에 IStudy 인터페이스 형식으로 학생 개체에 접근해야 합니다.

강의 시작 시퀀스 다이어그램

모든 장소에는 기반 클래스인 Place에 학생을 보관하는 컬렉션이 있습니다. 따라서 파생 형식인 각 장소에서 학생 개체에 접근하기 위해 컬렉션에 보관한 학생 수와 특정 인덱스의 학생 개체를 구하는 메서드를 제공하세요.


class Place

{

    ...중략...

protected:

    ...중략...

    size_t GetCount()const;//학생 수

    Man *GetAt(size_t index);//index 위치 학생 반환

    ...중략...

};

 

학생 수를 구하는 GetCount 메서드에서는 유닛 컬렉션 base GetSize 메서드 호출 결과를 By Pass 합니다.

size_t Place::GetCount()const//학생 수

{

    return base.GetSize();

}

 

특정 인덱스의 학생 개체를 반환하는 메서드에서는 유닛 컬렉션 base의 인덱스 연산 결과를 By Pass 합니다. 각 장소에서는 약속한 기능만 수행할 수 있게 해야 하므로 Man * 형식으로 반환합니다.

Man *Place::GetAt(size_t index) //index 위치 학생 반환

{

    return base[index];

}

 

그리고 IStudy 인터페이스에 ListenLecture 메서드를 순수 가상 메서드로 약속하세요.

interface IStudy

{

    virtual void ListenLecture()=0;

};

 

학교의 StartLecture 기능을 구현합시다.

void School::StartLecture()//강의 시작

{

    cout<<"강의 시작"<<endl;

먼저 학생 수를 구합니다.

    size_t max = GetCount();//학생 수 구하기

학생 수만큼 반복합니다.

    for(size_t index = 0; index<max; ++index)

    {

학교에서 학생에게 명령할 수 있는 기능은 IStudy 인터페이스에 약속하였습니다. 따라서 특정 인덱스의 개체를 IStudy *로 하향 캐스팅을 합니다.

        IStudy *istudy = dynamic_cast<IStudy *>(GetAt(index));

        if(istudy)

        {

istudy 인터페이스의 멤버 ListenLecture 메서드를 호출합니다.

            istudy->ListenLecture();

        }

        else

        {

만약 하향 캐스팅을 할 수 없으면 프로그램에 버그가 있는 것이므로 예외를 던집니다.

            throw "장소에 있는 개체가 IStudy 형식으로 하향 캐스팅을 할 수 없습니다.";

        }

    }

}

 

학생 클래스에 ListenLecture를 가상 메서드로 변경하고 누가 강의를 받는 것인지를 출력합시다.

class Student:public Man, public IStudy, public IRelax, public IPlay

{

    ...중략...

public:

    ...중략...

    virtual void ListenLecture();

    ...중략...

};

 

Student 클래스의 ListenLecture 메서드에서는 누가 강의받는 것인지 출력합시다.

void Student::ListenLecture()

{

    cout<<GetName()<<" 강의받다."<<endl;

}

 

그리고 학사 학생, 마법 학생, 운동 학생의 ListenLecture에서는 Student 클래스의 ListenLecture를 호출하는 부분을 추가하세요.

void SStudent::ListenLecture()

{

    Student::ListenLecture();

    ...중략...

}

void MStudent::ListenLecture()

{

    Student::ListenLecture();

    ...중략...

}

void PStudent::ListenLecture()

{

    Student::ListenLecture();

    ...중략...

}

 

이제 컴파일 및 빌드하신 후에 테스트를 해 보세요.

68. 최종 실습 - 개발 공정 및 시나리오

69. 최종 실습 - 요구 분석 및 정의

70. 최종 실습 - 설계1(클래스 다이어그램)

71. 최종 실습 - EHNARA 뼈대

72. 최종 실습 - 프로토 타이핑

73. 최종 실습 - 확장 가능한 순차 배열

74. 최종 실습 - 클래스 추가하기

75. 최종 실습 - 초기화 및 해제화

76. 최종 실습 - 학생 생성

77. 최종 실습 - 학생 이동

78. 최종 실습 - 전체 보기

79. 최종 실습 - 학생 복귀

80. 최종 실습 - 강의 시작

81. 최종 실습 - 도서관 가기

82. 최종 실습 - 소등

83. 최종 실습 - 거실로 가기

84. 최종 실습 - 파티

85. 최종 실습 - 노래방 가기

86. 최종 실습 - 다이어그램

87. 최종 실습 - 소스 코드

반응형