전방선언

CJB_ny·2022년 8월 18일
0

C++ 정리

목록 보기
59/95
post-thumbnail


스택이건 힙이건 관련 없이

이렇게해서 빌드를 하면 통과를 한다.

Player의 설계가 완성이 되었다는 것이다.

이런식으로 메모리에 Player를 올리기위해서 가장 중요한 부분은

이 Player의 크기가 몇 바이트인지 알아야 한다.

동적할당도 마찬가지로 Player가 몇 바이트 인지 알아야한다.

Player는 몇 바이트인가?

2 * 4 => 8바이트.

그렇다면 일반 타입이 아니라 포인터를 들고있을 경우는?

내가 주시하는 몬스터를 Player에 관리한다고 치고

멤버 클래스로 들고있는 경우랑 포인터 변수로 들고있는 경우 둘중 하나를 선택해야한다.

(이거 두개의 특징을 계속 알아보았다)

이경우에는 이제는 Player가 몇 바이트이냐?

일단 8 + 몬스터 크기인데

몬스터 크기는

이렇게 타고 들어가보기 전까지는 모른다.

포인터 들고있는 경우

#inlcude "Monster.h"를 해주어서 설계도를 모른다고 하더라도

포인터변수는 운영체제에 따라서 4/8바이트 이기 때문에

몇바이트인지 알 수 있다.

그런데 Monster라는 애가 존재하는지에 대한 의문을 컴파일러가 가지기 때문에

include까지는 가지 않지만

등장할 것이라고 앞에다가

이런식으로 선언만 해주는 것이다.

이게 "전방 선언"이다.

참고 언리얼 엔진

언리얼 엔진에서는 이렇게 전방선언 한다.

치트키 같은 함수 ❗

KillMonster라는 함수 만들고

.cpp파일에서는 멤버 포인터 변수에 접근하여 _hp를 0으로 만든다고 해보자.

그런데 에러가 난다...

이유가 뭘까?

일단, 분명히 Player.h를 include 해줬는데 뭐가 문제이지?

_target->_hp = 0; == *(_target)._hp = 0;

이거랑 완전히 똑같다.

포인터의 주소에 * 원본으로 접근하겠다! 라는 것 까지는 ㄱㅊ은데

지금 _target._hp _hp에 접근을 하는 부분이 에매하다.

이 _hp라는 값은 어디에 있는지 어떻게 찾을래?

주소를 타고 가면 이렇게 _hp라는 데이터가 있기는 있을 것이다.

근데 안되는 이유 ❓

_monsterId; 0 offset

_hp; +4 offset

_defense; +8 offset

이렇게때문에

Player.cpp에서 구현해놓은 KillMonster라는 함수내에서

멤버 포인터 변수인 _target._hp 를 한다는 말이

_target이라는 시작주소에서 몇번째 칸으로 뒤어 넘어야 하는지를 모르기 때문에

Monster클래스 설계도를 알아야한다는 것이다 ❗❗

Monster라는 설계도(클래스)도 메모리에 올라가면 4바이트 단위로 올라갈 것이기 때문에

변수들이 offset단위로 있을 것이기 때문이다.

그래서 include를 통해 추가를 해야지만

이제 _target._hp에 +4 offset에 접근해라 라는 것을 알고 접근이 가능해지는 것이다.

전방선언 해준 경우

그렇다면 Player안에서 전방선언을 해준다 치자.

이 calss Monster* _target;은 전방선언인데

=> "나중에 Monster라는 class가 등장할 테니까 나좀 통과 시켜줘~" 라는 의미에 가깝다.

그래서 관심을 두지 않은 상태인데

이상태에서는 _target->_hp가 어디에 있는지 (offset) 모르기 때문에

찾을 수 없다 => 에러가 난다.

Player를 멤버 클래스로?

Player는 몇 바이트 이냐? 8byte + sizeof(Player) ??

Player를 아기위해서 Player의 설계도를 알아야한다?

=> 이거 말이 안된다. => 컴파일 에러남.

근데 이게 아니라 포인터를 붙이는 경우에는

빌드가 통과가 되는데

= > "Player는 몇바이트인가?"를 다시 생각해보면됨.

=> 8 + 운영체제에 따른 포인터 변수의 크기;

이런 경우임.

근데 그냥 _target을 타고가면 도 다른 Player의 주소가 있을 뿐이다.

뭐 일단 이렇게응용이 가능 할 것이다.

질문 ❗

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

0개의 댓글