작성
·
49
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니 암시적으로 형변환이 될 줄 알았는데 명시적으로 해주어야 하는 이유가 있나요?
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 박건우님.
질문 주신 내용을 바탕으로 설명드리겠습니다. C++에서 형 변환과 관련된 문제들은 종종 혼란을 줄 수 있습니다. 특히 기초적인 형태의 클래스 포인터들 사이에서의 형 변환은 주의하지 않으면 예상치 못한 동작을 유발할 수 있습니다.
Player*&
형태인 경우 이중 포인터처럼 동작하는데, 이는 참조할 대상 포인터를 재지정할 수 있는 것입니다. Player*&
은 Player*
의 참조 타입이므로, 이를 맞추기 위해 적절한 형 변환을 해야 할 때가 있습니다.reinterpret_cast
를 통해 포인터의 형 변환을 명시적으로 수행해 줌으로써, 컴파일러는 특정한 형식 불일치에 대해 경고하거나 오류를 발생시키지 않게 됩니다. 사용할 때는 매우 주의해야 하는데, 잘못하면 미묘한 오류가 생기기 쉽기 때문입니다.독립적으로 객체 간의 명시적/암시적 변환이 어떻게 이루어지는지, 특히 포인터나 참조를 다룰 때 나타나는 특별한 경우들에 대해 다시 한번 살펴보시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.