[C++] 82. 최종 실습 - 소등
이번에는 소등 기능에 관해 시퀀스 다이어그램을 작성하고 난 후에 구체적인 코드를 구현합시다.
소등 기능은 주거지에 있는 모든 학생의 Sleep을 수행하게 합니다. 그런데 각 장소에서는 해당 장소에서 명령할 수 있는 기능만 보이게 한정하였기 때문에 IRelax 인터페이스 형식으로 학생 개체에 접근해야 합니다.
그리고 IRelax 인터페이스에 Sleep 메서드를 순수 가상 메서드로 약속하세요.
interface IStudy
{
virtual void Sleep()=0;
};
주거지의 TurnOff 기능을 구현합시다.
void Village::TurnOff()//소등
{
cout<<"소등"<<endl;
먼저 학생 수를 구하여 반복합니다.
size_t max = GetCount();//학생 수 구하기
for(size_t index = 0; index<max; ++index)
{
주거지에서 학생에게 명령할 수 있는 기능은 IRelax 인터페이스에 약속하였습니다. 따라서 특정 인덱스의 개체를 IRelax *로 하향 캐스팅을 합니다.
IRelax *irelax = dynamic_cast<IRelax *>(GetAt(index));
if(irelax)
{
IRelax 인터페이스의 멤버 Sleep 메서드를 호출합니다.
irelax->Sleep();
}
else
{
만약 하향 캐스팅을 할 수 없으면 프로그램에 버그가 있는 것이므로 예외를 던집니다.
throw "장소에 있는 개체가 IRelax 형식으로 하향 캐스팅을 할 수 없습니다.";
}
}
}
학생 클래스에 Sleep을 가상 메서드로 변경하고 누가 잠을 자는 것인지를 출력합시다.
class Student:public Man, public IStudy, public IRelax, public IPlay
{
...중략...
public:
...중략...
virtual void Sleep();
...중략...
};
Student 클래스의 Sleep 메서드에서는 누가 잠을 자는 것인지 출력합시다.
void Student::Sleep()
{
cout<<GetName()<<" 잠을 자다."<<endl;
}
그리고 학사 학생, 마법 학생, 운동 학생의 Sleep에서는 Student 클래스의 Sleep 메서드를 호출하는 부분을 추가하세요.
void SStudent::Sleep()
{
Student::Sleep();
...중략...
}
void MStudent::Sleep()
{
Student::Sleep();
...중략...
}
void PStudent::Sleep()
{
Student::Sleep();
...중략...
}
이제 컴파일 및 빌드하신 후에 테스트를 해 보세요.
'언어 자료구조 알고리즘 > 디딤돌 C++' 카테고리의 다른 글
[C++] 87. 최종 실습 - 소스 코드 (1) | 2016.05.01 |
---|---|
[C++] 86. 최종 실습 - 다이어그램 (0) | 2016.05.01 |
[C++] 85. 최종 실습 - 노래방 가기 (0) | 2016.05.01 |
[C++] 84. 최종 실습 - 파티 (0) | 2016.05.01 |
[C++] 83. 최종 실습 - 거실로 가기 (0) | 2016.05.01 |
[C++] 81. 최종 실습 - 도서관 가기 (0) | 2016.05.01 |
[C++] 80. 최종 실습 - 강의 시작 (0) | 2016.05.01 |
[C++] 79. 최종 실습 - 학생 복귀 (0) | 2016.05.01 |
[C++] 78. 최종 실습 - 전체 보기 (0) | 2016.05.01 |
[C++] 77. 최종 실습 - 학생 이동 (0) | 2016.05.01 |