기존에 존재하는 오브젝트와
똑같은 오브젝트를 만드려고 하면
기본 복사 생성자를 통해 새로운
오브젝트가 생성이 될 겁니다.
하지만 그럴 경우 문제가 될 수 있는 점은,
다른 멤버들은 괜찮지만
Collider를 가리키고 있는 멤버
m_pCollider의 값이 그대로 복사가 되면,
아래 그림처럼
서로 값만 같고 실제로는 다른 두 오브젝트가
하나의 Collider를 공유하는 상황이 발생하죠.
이를 방지하기 위해 오브젝트의
복사 생성자를 직접 구현해야 합니다.
직접 구현한 CObject 클래스의 복사 생성자를 보시면
위칫값이나 크깃값, 오브젝트의 이름은
그대로 복사를 진행하고 Collider는 우선 nullptr로
초기화를 진행한 후, 새롭게 동적 할당한 공간에
인자로 받은 오브젝트의 Collider와 같은 값을 가진
Collider를 생성합니다.
그리고 새로 생성한 Collider가 있는 동적 할당된 공간을
멤버 m_pCollider로 가리키고 m_pCollider가 가리키는
공간에 존재하는 Collider의 멤버 m_pOwner가
복사 생성자를 호출한 객체를 가리키도록 합니다.
( 멤버 m_pOwner는 Collider가 어떤 오브젝트에
붙어 있는지 나타내기 위해 오브젝트의 주솟값을 저장하는
멤버이죠. )
복사 생성자를 호출한, 새로 생성된
오브젝트는 살아있는 오브젝트이므로
m_bAlive는 true로 초기화합니다.
이렇게 하면 오브젝트 부분은
복사가 올바르게 작동하겠죠.
확인을 위해 스타트 씬에서
pObj2를 선언하고 이것이 기존 플레이어의
값을 통해 새로 만든 플레이어를 가리키도록 합니다.
그리고 위치를 기존 플레이어의
살짝 옆에 생성되도록 하고
AddObject 함수를 통해 새로 만든
플레이어가 스타트 씬에 존재하도록 하여
실행하면 기존 플레이어 옆에 새로운
플레이어가 생성된 것을 확인할 수 있죠.
근데 모든 오브젝트는
CObject형 포인터로 가리키기 때문에
새로운 오브젝트를 복사 생성자를 통해
만드려고 하면 다운 캐스팅을 진행해야 한다는
번거로움이 있습니다.
이를 해결하기 위해
새로운 공간을 동적 할당하고
그 공간에 자기 자신과 같은
값을 가진 객체를 생성하여
이를 반환하는 함수를 만들면 좋겠죠.
그래서 부모 클래스인 CObject 클래스에
Clone이라는 가상 함수를 만들어
이를 상속받은 자식 클래스가 반드시
Clone이라는 함수를 구현하도록 하였습니다.
CObject를 상속받은
CPlayer 클래스 먼저 구현하겠습니다.
CPlayer 클래스에서는 복사 생성자를
구현할 필요는 없어 보이네요.
멤버 m_pTexture는 포인터이기는 하지만
애초에 멤버 m_pTexture는 텍스처 리소스를
가리키는 멤버이므로 하나의 리소스를
여러 오브젝트가 가리키는 게 효율적이죠.
CLONE이라는 매크로가 바로
새로운 공간을 동적 할당하고
그 공간에 자기 자신과 같은
값을 가진 객체를 생성하여
이를 반환하는 함수를 생성하는
매크로입니다.
인자로 받은 type을 통해
어떤 반환 타입을 가질 것인지,
어떤 자료형을 통해 동적 할당을 할 것인지
결정하고 이를 바탕으로 Clone이라는
함수를 헤더 파일에 생성하는 것이죠.
마찬가지로
CMissile 클래스와
CMonster 클래스에도 만들어 줍니다.
아래 35번째 줄에 있는
코드를 통해 볼 수 있듯이
기존 오브젝트가 갖고 있는 값을 기반으로
새로운 오브젝트를 만들고자 할 때,
Clone 함수를 통해서 편하게 복사를 진행할 수 있죠.
강의 출처 : https://www.youtube.com/watch?v=VbyXc-SGb0U&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=35
'Win32 API > 기초' 카테고리의 다른 글
Win32 API 기초 : Animation (2) (0) | 2024.08.28 |
---|---|
Win32 API 기초 : Animation (1) (0) | 2024.08.19 |
Win32 API 기초 : Scene (1) (0) | 2024.08.18 |
Win32 API 기초 : Event Manager (3) (0) | 2024.08.16 |
Win32 API 기초 : Event Manager (2) (0) | 2024.08.15 |