WinAPI 15 SceneManager (1)

CJB_ny·2022년 8월 31일
0

WinAPI

목록 보기
15/79
post-thumbnail

전방 선언

CScene클래스 만들고 안에서 클래스 '전방선언'

그러면 Scene의 멤버 변수로 사용못한다. => 구체적인 정보가 없기 때문에

얼마만큼 데이터 크기를 잡아서 메모리에 올릴래?? ㅇㅋ?? ㅇㅋ.

그래서 포인터밖에 사용못한다. => 포인터 밖에 사용못한다? => 메모리에 크기를 정해서 올릴 수 있나? => 올릴 수 있다. => 왜? => 크기를 아니까! => 크기가 몇인데? => 운영체제에 따라 다른데 64비트이면 8바이트 32비트이면 4바이트로 포인터의 크기가 잡힌다.

전방선언 이유?

최대한 컴파일 속도에 영향을 주지 않기 위해서다.

만약, 여기다가 직접 헤더를 참조를 했다면 참조한 부분 싹다 복붙 하니까

또한 CObject코드가 변경이 된다면 CScene쪽 코드도 확인을 해야한다.

헤더가 헤더끼리 서로 참조하는 것을 최대한 방지 하고자 '전방선언'한다.

vector<CObject*> ❗❗❗

벡터에 object포인터 받는 이유?

뭐 일단 첫번째로는 복사값들고있으면 존나 커짐.

두번째로는 최상위 부모 타입으로 들고있으면 자식아무나 다 받을 수 있다.

virtual ❗❗❗

지금 StartScene, ToolScene은 둘다 CScene을 상속받는데

지금 CScene 부모에서 무조건 해주어야하는 작업이 있다.

바로 '소멸자에 virtual' 이거 왜 해주어야하나??

상속을 받는 클래스 객체는 생성되면은 '표짓말'처럼 객체 제일앞 주소에 .vftable을 가진다.

이 RTTI를 사용하여 vftable에 따라 자신에 해당하는 함수를 호출 할 수 있다.

또한 부모클래스 포인터로 자식 클래스 객체를 들고있는 경우 나중에 해제를 할 때

'use after free', '댕글링', 'memory Leak'문제등이 발생할 수 있다.


10번 참고

https://velog.io/@starkshn/%EB%94%94%EB%B2%84%EA%B9%85-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-1-2#%EA%B0%95%EC%9D%98-%ED%92%80%EC%9D%B4-8


모든 씬들을 부모 포인터로 관리를 할 것이기 때문에

모든 씬들을 부모타임의 포인터로 관리할 수 있다.

메모리 누수 생각 ❗❗❗

이거 virtual 안 붙이면 부모 소멸자만 호출된다.
(이유는 다 설명함)

CObject 클래스도 마찬가지로 소멸자에 virtual붙여야 한다.

하나의 씬

하나의 씬 안에는 두개의 오브젝트를 관리하는 그룹이 있고 특정 오브젝트들을 넣어 줄 수 있어야한다.

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

0개의 댓글