Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- cinder-volume
- 도쿄여행
- 편의점 당고
- devstack
- offscreen-rendering
- 일본 혼자 여행
- 도쿄 혼자 여행
- OSMesa
- frame stack
- c-vol.service
- vogl
- OpenGL
- lvmdriver-1
- 학부생
- DeepLearning
- scratchapixel
- 혼자여행
- 시부야 여행
- 군입대 전 여행
- Azure Linux VM
- Azure Ubuntu VM
- graphics programming
- cloudvm
- 에비스 맥주 기념관
- headless server
- 논문리뷰
- OpenStack
- Azure Linux
- GoogleCloud
- 에비스 맥주
Archives
- Today
- Total
사월의눈의 DevBlog
dynamic_cast를 활용하여 Instance의 parent class 확인하기. 본문
언리얼 엔진 튜토리얼 강의를 보며 공부를 하다가 캐릭터의 SphereComponent 안에 Overlapped된 Actor 클래스를
Array안에 저장해놓고 Array안의 각각의 Instance가 Pickup class의 자손인지를 Casting으로 판별하는데
Casting이 성공하면 Pickup class의 자손이므로 상호작용을 하여 어떤 특정한 함수를 호출하며
Casting에 실패하면 아무런 행동도 하지않게 코드를 짜더라구요.
그래서 문득 이를 C++으로 구현해볼까 생각이 들어
Unreal Engine 4의 Cast 명령어와 유사하게 동작하는 dynamic_cast를 사용하여 구현해보았습니다.
#include <iostream> #include <vector> //this is parent of all class in this project. class Obj { public: Obj() {}; virtual ~Obj() { }; }; class A : public Obj { public: A() { }; }; class Item : public Obj { public: Item() {}; }; class HP : public Item { public: HP() {}; }; //now in the obj class, A and Item class is included, and HP class is included in the Item class. int main(void) { std::vector<Obj*> CollectedActors(5); CollectedActors[0] = new A; CollectedActors[1] = new HP; CollectedActors[2] = new HP; CollectedActors[3] = new A; CollectedActors[4] = new HP; //check each element in the CollectedActors vector whether it's parent is Item or not. for (int iCollected = 0; iCollected < CollectedActors.size(); ++iCollected) { Item* const testObj = dynamic_cast<Item*>(CollectedActors[iCollected]); if (testObj != nullptr) { std::cout << "This is Child of Item class" << std::endl; } else { std::cout << "This is not a Child of Item class" << std::endl; } } //delete pointers for (short iCollected = 0; iCollected < CollectedActors.size(); ++iCollected) { delete CollectedActors[iCollected]; CollectedActors[iCollected] = nullptr; } CollectedActors.clear(); return 0; }
코드를 보면 CollectedActors Vector내의 Obj 자손 클래스를 Item*로 캐스팅하는데 캐스팅에 실패하면 nullptr이 반환되므로
각각의 Instance에 대해 캐스팅을 시행하여 반환된것이 nullptr인지 아닌지를 검사합니다.
코드 실행 결과를 보면
HP 클래스로 동적할당된 1,2,4 index의 인스턴스에 대해서는 "This is Child of Item class" 라는 로그 메시지가 나타나며,
같은 Obj의 자손이지만 Item의 자손이 아닌 A로 동적할당된 0, 3 index의 인스턴스에 대해서는 "This is not a Child of Item class" 라는 로그 메시지가 정상적으로 잘 출력됨을 확인할 수 있었습니다.
Comments