E D R , A S I H C RSS

BackLinks search for "CollisionMap"

BackLinks of CollisionMap


Search BackLinks only
Display context of search results
Case-sensitive searching
  • MoreEffectiveC++/Techniques3of3
          static HitMap collisionMap;
         여기에서 collisionMap은 관련배열(associative array)이다. 그것은 클래스의 이름과(string 객체로) SpaceShip 멤버 함수 함수 포인터를 묶는다. 왜냐하면 map<string,HitFunctionPtr>로 하나로 묶였기 때문에, 이제 typedf을 이용해서 한번에 처리하기가 더 쉬워진다.(재미있게도 collisionMap의 선언은 HitMap과 HitFunctionPtr의 typedef 없이 한다. 대부분의 사람들이 이런식으로 처리를 원할 것이다.)
         주어진 collisionMap으로 lookup의 구현은 다소 묘하게 바뀐다. map클래스가 지원하는 찾는 방식이 그러하다. 그리고 우리가 항상 typeid의 결과로 호출하는것은 name 이다.(예상할수 있겠지만, 객체의 동적 형태의 이름이다.) 그런데, lookup의 구현을 위해 우리는 collisionMap과 lookup의 구문에서 동적 형이 반응하는 엔트리를 찾으면 된다.
          static HitMap collisionMap; // 초기화 관련은 다음 주제에서 살핀다.
          HitMap::iterator mapEntry= collisionMap.find(typeid(whatWeHit).name());
          if (mapEntry == collisionMap.end()) return 0;
         이제, collisionMap의 초기화가 남았다. 다음과 같은 모습으로 생각할수 있을 것이다.
          static HitMap collisionMap;
          collisionMap["SpaceShip"] = &hitSpaceShip;
          collisionMap["SpaceStation"] = &hitSpaceStation;
          collisionMap["Asteroid"] = &hitAsteroid;
         지금 필요한것은 collisionMap이 생성될때 단 한번만 멤버 함수 포인터를 입력시키는 방법이다. 그건 쉽게 만들수 있는데, 우리 단지 자역 정적 함수로서 inializeCollisionMap을 호출해서 map의 초기화와 생성을 담당하게 만들면 된다. inializeCollisionMap의 반환 인자로 collisionMap을 초기화 한다.
          static HitMap initializeCollisionMap();
          static HitMap collisionMap = initializeCollisionMap();
         하지만 이것은 initializeCollisionMap이 반환하는 map객체를 collsionMap에 복사하면서 비용을 지출한다. (Item 19, 20 참고) 이를 행하지 않게 만들어야 한다. 만약 inializeCollisionMap이 포인터를 반환하면 비용 지출을 하지 않지만, map객체가 파괴되어야 하는 것에 혼란을 가지고 올수 있다.
         다행히도, 여기에는 방법이 있다. 우린 collsionMap을 스마트 포인터(Item 28참고)로 자동으로 삭제되도록 만들어 버리는 것이다. 사실 C++ 표준 라이브러리에 있는 템플릿인, auto_ptr는 이런 상황에 적합할 것이다. (Item 9참고) collsionMap을 정적 auto_ptr로 lookup내부에서 만드는 것으로 initializeCollisionMap이 반환하는 초기화된 map 객체를 건네 받을수 있다. 이렇게 하면 자원이 세는것을 걱정할 필요는 아직 없다. collisionMap이 가리키는 map객체는 자동으로 삭제될것이다. 그래서 :
          static HitMap * initializeCollisionMap();
          static auto_ptr<HitMap> collisionMap(initializeCollisionMap());
         initializeCollisionMap의 구현을 명확히 한다.
         SpaceShip::HitMap * SpaceShip::initializeCollisionMap()
Found 1 matching page out of 7544 total pages

You can also click here to search title.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
Processing time 0.0108 sec