inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

디버깅 문제 풀이 #3

마지막 문제 질문드립니다.

162

박건우

작성한 질문수 4

0

class Player;

class Arrow
{
public:
	Arrow(Player*& target, int damage);
	~Arrow();

public:
	void AttackTarget();

public:
	Player*& _target;
	int _damage;
};

Arrow 부분의 생성자와 멤버 변수를 이렇게 바꾸고

Arrow* arrow = new Arrow(knight, archer->_attack); 이렇게 넣으면 될 줄 알았는데 안되서

Arrow* arrow =

new Arrow(reinterpret_cast<Player*&>(knight), archer->_attack); 이렇게 강제 형변환을 해주니 실행되더라구요.

 

knight의 부모가 Player니 암시적으로 형변환이 될 줄 알았는데 명시적으로 해주어야 하는 이유가 있나요?

c++

답변 2

0

Rookiss

그냥 *로 했으면 말씀하신대로 되었을 것 같은데,
혹시 포인터의 참조형을 사용하신 이유가 있을까요?

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 박건우님.

질문 주신 내용을 바탕으로 설명드리겠습니다. C++에서 형 변환과 관련된 문제들은 종종 혼란을 줄 수 있습니다. 특히 기초적인 형태의 클래스 포인터들 사이에서의 형 변환은 주의하지 않으면 예상치 못한 동작을 유발할 수 있습니다.

핵심 요점:

  • 암시적 형 변환: C++에서는 자식 클래스 객체를 부모 클래스 포인터로 암시적으로 형 변환할 수 있습니다. 이는 부모 클래스의 함수나 포인터에 자식 객체를 넘길 때 자주 사용됩니다.
  • 참조형 포인터 사용: Player*& 형태인 경우 이중 포인터처럼 동작하는데, 이는 참조할 대상 포인터를 재지정할 수 있는 것입니다. Player*&Player*의 참조 타입이므로, 이를 맞추기 위해 적절한 형 변환을 해야 할 때가 있습니다.
  • reinterpret_cast 사용: 이 경우, reinterpret_cast를 통해 포인터의 형 변환을 명시적으로 수행해 줌으로써, 컴파일러는 특정한 형식 불일치에 대해 경고하거나 오류를 발생시키지 않게 됩니다. 사용할 때는 매우 주의해야 하는데, 잘못하면 미묘한 오류가 생기기 쉽기 때문입니다.

참고할 수 있는 자료:

독립적으로 객체 간의 명시적/암시적 변환이 어떻게 이루어지는지, 특히 포인터나 참조를 다룰 때 나타나는 특별한 경우들에 대해 다시 한번 살펴보시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

소스코드와 관련하여 질문드립니다

0

65

1

map 컨테이너의 emplace 함수에 대해

0

105

2

시작이 안되네요...!

0

95

2

EAX 명령어 실행 시 RAX의 상위 32비트가 초기화 되는 이유

0

123

1

리틀 엔디안 장점 질문합니다.

0

129

1

메모리 창에 주소를 넣었는데 영어 꺠짐

0

123

1

타입변환#2 build시 knight 인접 stack이 침범당했다는 error가 발생합니다.

0

93

2

map #1 8분 58초 맵은 레드블랙트리로 이루어진 것 같습니다.

1

138

2

hello world 부터 오류 ㅠㅜ

0

184

1

지역변수가 스택? 레지스터

0

126

2

메모리창이 비활성화됩니다.

0

98

1

이중포인터 강좌 부분 질문있습니다.

0

145

1

2를 더하는 이유

0

131

1

메모리 주소 창 엔디안 질문 드립니다. 인프런 봇 답변도 괜찮습니다

1

109

1

해당 코드는 왜 오류가 날까요?

0

153

1

마지막 문제 질문 있습니다.

0

115

1

강의 마지막부분에 질문이 있습니다.

0

190

2

Field초기화

0

140

1

virtual과 override 차이

0

311

2

3:30 참조자 리턴

0

164

1

map 찾기

0

155

1

프로그램 질문드려요

0

255

1

캐스팅 질문

0

134

1

암시적/명시적 생성자 쓸 때 주의할 점 공유

0

279

1