[ 전방선언 ]
전방 선언이 왜 필요한지 부터 알아보자.
스택영역에 Player를 만들던 Heap 에 만들던
Player가 몇 바이트인지 알아야 만들 수 있다.
player 가 int 형 멤버변수 2개를 들고 있다면 sizeof(p1) 이나 sizeof(p2)는 8 이 나올것이다 ( 당연 )
근데 문제는 Player 클래스가 상속은 제쳐두더라도, Monster 라는 클래스를 가지고 있다고 생각해보자.
( 옳바르지 않은 예인것 같지만, 그냥 그렇다고 쳐보자 )
그러면 다시 Player는 몇 바이트인가?
Monster의 크기를 알아야 Player의 크기를 알 수 있다.
그렇기 때문에
Player.h 에서 "Monster.h" 파일을 include 해줘야 알 수 있다.
반대로 Player가 Monster를 포인터 형으로 들고 있다고 해보자.
( 포인터가 아니면 종속적으로 들고 있게 된다. )
이렇게 되면 어떤 클래스가 오던 x86 은 4바이트 , x64 는 8바이트 값을 가질것이다.
Monster 클래스가 어떤 내용을 들고 있던 전혀 무관해진다.
다만 문법상으로 Monster가 존재하는지 아닌지 의심스러우니깐
include 까지 하지 않고, 위에다 선언만 해주는것이 전방선언이다.
모든 문제가 해결된것은 아니다.
만약 Player에 KillMonseter 함수가 있다고 해보자.
이 경우 왜 오류가 날까 생각해보자.
_target -> _hp 는 *(_target)._hp 랑 같은 소리이다.
문제는 _target이라는 포인터(주소)로 가는데는 문제가 없다. 근데
그 주소값으로가서 _hp 라는 int 형 변수가 시작 주소 기준으로 +4 offset 인지 몇번째 offset 인지 확인하지 못한다는것이다.
결국은 include를 다시 해줘서 monster 사용할 수 있게끔 해줘야된다.
이렇게 해줘야 비로서 Monster 관련 함수나 멤버변수를 사용할 수 있는 것이다.
위의 에러는 private 때문에 생긴 에러이다.
결론 :
포인터로 들고 있을때는 애당초 고정크기이다 보니깐 당장은 전방선언으로만 해줘도 되는데
추후에 그 안의 내용을 사용하려면은 "~~.h" 파일을 include 해줘야한다.
한 가지더 +
Player 클래스 안에 Player 를 넣는게 가능할까?
원초적으로 Player는 몇바이트인가? 를 물어보면 된다.
Player는 일단 int형 2개 8바이트 + sizeof(Player) 인데
이 sizeof(Player) 를 계산하기 위해서는 또 안의 sizeof(Player)를 계산해줘야 하고 , 이런게 반복된다. ( 재귀 느낌)
그러니 컴파일러에서도 이렇게 오류를 뱉어내는것을 알 수 있다.
반면에 Player* 포인터 타입으로 가지고 있게 되면 통과가 되는것을 알 수 있다.
Player* 은 고정 크기로 4 Byte 이기 때문에.
그러니깐 클래스가 몇 바이트인가? 를 항상 물어보자.
'C++과 언리얼로 만드는 게임 개발 > Part1. C++ 문법' 카테고리의 다른 글
Day11 ( 80.36% ) (0) | 2022.04.17 |
---|---|
Day10 ( 79.46% ) (0) | 2022.04.17 |
Day8 - ② ( 64.28% ) (0) | 2022.03.31 |
Day8 - ① 동적할당 / ★타입 변환★( 61.60% ) (0) | 2022.03.31 |
Day7 ( 54.46% ) (0) | 2022.03.30 |