dynamic_cast 예제

vec3 camDir = m_pFirstPersonCamera->m_LookingAt – m_pFirstPersonCamera->GetPosition(); vec3 camPos = m_pFirstPersonCamera->GetPosition(); btVector3 btFrom (camPos.x, camPos.y, camPos.z); btVector3 btTo = btFrom + btVector3 (camDir.x, camDir.y, camDir.z) * m_Reach; btCollisionWorld:::가장 가까운레이결과콜백 레스(btFrom, btTo); m_pScene->겟불릿월드()—GetDynamicsWorld()->레이테스트(btFrom, btTo, res); 경우 (res.hasHit()) { 상호 작용 가능한* temp = dynamic_castgetUserPointer(); 경우 (temp) m_CurrentIteractable = temp; else m_CurrentIteractable = nullptr; } “dynamic_cast에 대한 필요성은 파생 된 클래스 개체에서 파생 된 클래스 작업을 수행하려는 것이지만 포인터 또는 참조 – 기반만 있기 때문에 일반적으로 발생합니다”라고 Scott Meyers는 그의 책 “유효 C ++”에서 말했습니다. 안녕하세요, 저자, 동적 캐스트를 사용하는 좋은 예가 있습니다. 레이캐스트를 수행해야 하는 게임을 작성할 때 플레이어 앞의 게임 오브젝트가 상호 작용할 수 있는 개체인지 확인합니다. 실패하면 상호 작용할 수 없는 일반 게임 오브젝트이며 아무 일도 일어나지 않습니다. 그러나 성공하면 상호 작용할 수있는 객체를 저장하고 상호 작용합니다! 여기서 Interactable은 가상 상호 작용() 함수가 있는 추상 클래스일 뿐이며 파생 된 클래스는 실제로 수행하는 작업을 구현해야하므로 여기에서는 상호 작용 가능한 픽업 또는 깨지기 쉬운 개체 또는 무엇이든 논의할 필요가 없습니다. 상호 작용()이라고 부르면 호출할 적절한 함수를 찾을 수 있습니다. 이 예제에서는 DoSomething(창* w)가 창 포인터아래로 전달됩니다. Scroll 개체에서만 사용할 수 있는 scroll() 메서드를 호출합니다. 따라서이 경우 개체가 scroll() 메서드를 호출하기 전에 스크롤 유형인지 여부를 확인해야합니다. rtti를 사용하지 않도록 설정하면 dynamic_cast를 일반적으로 사용해서는 안된다는 것을 간단히 지적 할 수 있습니다. 일반적으로 컴파일러가 컴파일타임에 올바르게 추측된 경우 100% 예외 또는 캐스팅이 발생하며, 그렇지 않으면 정의되지 않은 것처럼 보입니다(이 경우 경고할 수도 있고 경고하지 않을 수도 있음).

이 계층구조에서 A는 가상 기본 클래스입니다. 클래스 E의 인스턴스와 A 하위 개체에 대한 포인터가 주어지면 모호성으로 인해 B에 대한 포인터에 대한 dynamic_cast가 실패합니다. 먼저 전체 E 개체로 다시 캐스팅한 다음 명확한 방식으로 계층 구조를 백업하여 올바른 B 개체에 도달해야 합니다. 관리 코드에서 dynamic_cast의 동작에는 두 가지 주요 변경 사항이 있습니다: `dynamic_cast 및 reference`의 코드는 나에게 오류를 제공합니다: 내 부분에 대한 실수 – Visual Studio에서 허용하더라도 r-value로 비 const 참조를 초기화할 수 없습니다. 그렇게 할 수 있습니다). 참조가 lvalue로 초기화되고 있는지 확인하여이 작업을 해결하려면 예제를 업데이트했습니다. 예. 참조와 함께 dynamic_cast를 사용할 수 있으며 실패하면 std::bad_cast 형식의 예외가 throw됩니다. 나는 공과에 그렇게하는 방법의 예를 추가했다. 그것은 부분적으로 사실이다. dynamic_cast가 가상 기본 클래스에서 작동하지 않는 몇 가지 경우와 해결 방법을 보여 주면서 강의를 업데이트했습니다.