2주차 C++ 과제 2
2주차 C++ 과제 2
C++의 다형성을 이용하여
기본적인 캐릭터와 플레이어,
그리고 플레이어들에 대한 전직과 몬스터를 구현하는 작업이다
구현 요구 사안 1
- 기본 구현 사안
- 각 전진의 부모가 될 플레이어 클래스 생성
- Attack 함수 구현
- 전직 클래스는 각각의 특징에 맞게 Attack()을 Override하여 구현
구현 요구 사안 2
- 도전 구현 사안
- Monster 클래스를 생성
- Attack을 monster에게 하여, 대미지를 통한 전투 구현
실제 구현 장면
- 전사 클래스
- 마법사 클래스
- 도적 클래스
- 궁수 클래스
- 몬스터한테 패배
파일 구조
이전에 구현해둔 Task1의 기반을 가져다 사용
클래스 구조
Character
- 체력 등의 스탯과 스킬을 관리하는 캐릭터 주체
- Stat을 Base와 Enhanced로 나누어 기본 스탯과 강화 영향을 받은 스탯으로 분류
- Attack, Hit 함수를 순수 가상함수(=0)으로 구현하여 실체화를 방지
Skill
- 대미지 비율과 마나 소모율을 관리하는 클래스
(구조체로 구현했어도 괜찮았을듯)
Player
- Character를 상속받고 Inventory를 관리하는 Player 주체
- 전직용 Enum을 넣어두었고, Player 자신은 Nobiss(초보자)로 선언
(실체화 자체는 가능)
- Level 변수 추가(Monster에는 필요 없으므로)
Inventory
- 포션과 같은 아이템을 추가, 사용하도록 관리하는 주체
(다만 이번에는 사용을 하지 않는다)
Warrior, Magician, Thief, Archor
- 각각 Player를 상속받으며, 내부에서 Attack을 재정의한 자식 클래스들
- 다형성을 기반으로 MainGame에선 업캐스팅으로 Attack 호출해주면 된다
추가 파일들
Utils - IsNotValid, SafeDelete 등의 매크로를 별도로 저장한 헤더 파일
Enums - Enum을 모아 놓은 헤더 파일
트러블 슈팅
솔직히 오늘은 없을 줄 알았다
MainGame에서 직업별 클래스를 생성하는 중
이상하게도 Warrior 클래스가 인식이 되지 않는 문제가 있었다
error는 C2061로서, 구문 오류이다
그런데 분명 include를 해놓았기에
매우 이상한 상황이였다
그렇기에 VS를 껏다 켰는데도
문제가 지속되자
왜 이러지 싶어서 이상하리만큼 색이 다른 Warrior에 키워드를 올린 순간…
응…???
Enum…????
Enum.h 또 너야?
(사실 이렇게 작성한 내 잘못이다)
전직 개념을 사용할때
클래스에 대한 Enum을 통하여 실제로 Dynamic_cast를
호출할만한 거리를 줄이는 것은 성능상 도움이 되기에
나는 Player용 변수로 classIdx라는 Enum을 선언했었다
근데 문제는 멍청하게도 해당 Enum과
클래스 이름을 완벽하게 같이 설정해버렸다는 것…
Enum 이름을 유니크하게 설정하는 것으로 바꿔주었다
문제 없이 동작한다!
Enum Class?
암묵적으로 Enum은 내부에서 int 와 같은 정수형 타입으로 처리되기에
연산자를 통한 비교 등이 가능하다
(ex : ClassIdx::Nobiss > ClassIdx::Archer 등)
그러나 이러한 암묵적 정수 변환이 문제가 발생할 가능성이 있기에
C++ 11부터 Enum class를 만들어
‘암묵적’ 변환을 금지시켰다
(Static_cast 같은 명시적 변환으론 변경 가능)
대신 다른 Enum class와 이름이 같더라도
‘별개’의 이름으로 처리되기에 Enum끼리 이름이 같아
충돌되는 현상을 방지할 수 있다
겹치기 쉬운 Enum 이름의 처리 방식
- 앞서 본 CLI_ 처럼 접두사나 접미사 를 만들어 겹치기 힘든 이름으로 수정
- Enum class를 사용하기
- namespace를 통한 분리
후기
어제는 분명 복잡한 기능을 넣어 시간이 낭비된 줄 알았는데
막상 오늘은 어제 구현된 기능을 잘만 사용하여
더 빠른 시간내로 구현이 가능하였다
어찌 보면 어제 짜둔 코드가 확장성이 있기에
비교적 빠르게 전직 시스템을 짤 수 있었던 것 아닐까?
시스템의 구조는 여러모로 ‘타협’의 산물이란 것을
다시 느끼는 하루다
댓글남기기