WinAPI 35 Object (1)

CJB_ny·2022년 9월 15일
0

WinAPI

목록 보기
34/79
post-thumbnail

오늘 배운거 👍👍👍

  • 암시적 복사 생성자

    1) 부모 클래스의 복사생성자 호출
    2) 멤버 클래스 복사 생성자 호출
    3) 1), 2) 둘다 아니라면 멤버가 기본 타입일 경우 메모리 복사. (얕은 복사)

  • 명시적 복사 생성자

    명시적 = 우리가 다 컨트롤 하기 때문에 기본 생성자가 호출 될 수 밖에 없다.

    1) 부모 클래스의 기본 생성자 호출
    2) 멤버 클래스 기본 생성자 호출

  • 암시적/명시적 복사생성자를 활용한 오브젝트 복사 생성

  • 순수 가상함수를 통한 Clone 생성


오브젝트 복사할 때

어떤 오브젝트가 복사 되기를 원하는데

그냥 복사 생성자나, 복사대입 연산자 통해서 객체를 복사받는 경우

안에들어있는 'Collider'까지 주소가 같은것으로 복사가된다.

이러면 '얕은 복사' => '깊은 복사'를 원한다.

=> 깊은 복사를 원한다면 복대연이나 복사 생성자안에서 직접 구현해 주어야한다.

Player의 경우

Object를 상속을 받는 Player의 경우 부모쪽 다 상속을 받을 것이다.

이렇게 Texture들고있는데 문제가 있을까?

포인터라고 무조건 다 복사했을 때 문제가 있는게 아니라

Texture의 기능을 생각을 한다면은 문제가 없는 부분이다.

복사받기를 원하는 부분이니까.

최상위 부모인 Object의 복사생성자부분을 Collider가 깊은 복사가 일어날 수 있게 수정한다.

player 복사 생성자 ❗❗❗

굳이 구현을 하자면은 이런식으로 구현이 되는데 이게 명시적 복사 생성자를 구현한 모습이다?

그런데 Player의 복사생성자를 이렇게 구현을 안해도 됨.

이유는...

https://velog.io/@starkshn/%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC-vs-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC-1-2

부모의 복사생성자를 호출 받기를 원하고, Player의 복사생성자는 기본 복사생성자를 호출하기를 원한다.

복사생성자 구현을 안한다? => '암시적 복사생성자'를 호출 하겠다라는 것인데...

'암시적 복사 생성자' 호출 규칙? 순서?는

1) 부모 클래스의 복사생성자 호출
2) 멤버 클래스 복사 생성자 호출
3) 1), 2) 둘다 아니라면 멤버가 기본 타입일 경우 메모리 복사. (얕은 복사)

이렇다..


'명시적 복사 생성자' 호출 규칙? 순서?

1) 부모 클래스의 기본 생성자 호출
2) 멤버 클래스 기본 생성자 호출


우리는 Collider 때문에 부모쪽에 부모의 복사생성자를 '깊은 복사'를 할 수 있게 만들어 두었고

player의 Texture는 Resource의 개념을 통해 그대로 복사받고 싶으니까

'암시적 복사 생성자' 를 사용할 것이다.

(물론 명시적으로 구현해서 암시적 복사생성자 처럼 호출 할 수 있기는 하다)

플레이어 하나 더 추가해보기

obj를 CPlayer로 변환후 이것을 다시 포인터로 CPlayer의 복사생성자를 호출한다.

근데 이부분 조금 햇갈리고 귀찮다.

그래서 최상위 부모에 나 자신을 복사할 Clone함수를 순수가상함수로 만들 것이다.

순수 가상 함수 ❗❗❗

부모쪽에 이런 순수 가상함수를 선언을 해주고

player쪽에서 구현을 해주도록 하자.

나 자신 == *this를 동적할당해서 바로 반환한다.

이렇게되면

이랬던 부분이 이제는

가상함수 테이블 흐름 ❗❗

현재 obj만들때 메모리 주소 0번째 offset에는 가상함수 테이블 주소가 들어간 객체 => 'obj'가 만들어 진 것이다.

obj의 Clone을 호출하게되면 .vftable 의 주소에따라 Player의 Clone이 호출되게 된다.

Player의 Clone을 보면은 *thos == 나 자신 즉, obj 자신을 가르킨다.

이것을 new Player(*this) 넣어주어 '암시적 복사생성자'를 호출하게되는 것이다.

그렇게되면 부모쪽의 복사생성자가 호출이되고

그래서 만들어진 객체를 CObject* 주소로 반환을 하는 것이다.

즉, 정리하자면은

암시적 복사 생성자 호출할 경우 부모 복사생성자를 호출을 하고 본인은 기본생성자를 호출하여 값일 복사받는다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글