E D R , A S I H C RSS

BackLinks search for "GameObject"

BackLinks of GameObject


Search BackLinks only
Display context of search results
Case-sensitive searching
  • MoreEffectiveC++/Techniques3of3
         class GameObject { ... };
         class SpaceShip: public GameObject { ... };
         class SpaceStation: public GameObject { ... };
         class Asteroid: public GameObject { ... };
         void checkForCollision(GameObject& object1, GameObject& object2)
         이는 프로그램의 역할을 명확하게 해준다. processCollision이 호출때, object1과 object2가 충돌한다는 것과, 이 충돌의 영향이 object1과 object2에게 상호 의존적이라는 것을 알수 있다. 그렇지만 문제는 이 객체의 종류를 알수 없다는 점이다.;둘다 알다시피 GameObject라고 명시되어 있다. 만약 충돌의 과정이 object1의 동적형에 의존한다면 당신은 GameObject내의 가상함수로 되어 있는, processCollision를 호출해서 처리해야하고, object1.processCollision(object2) 이런식의 호출을해야 한다. 역시나 object2에 의존적이고, 동적이라면 같은 방식으로 처리되어야 한다. 그렇지만 충돌시 처리해야 할 수행과정은 충돌 객체의 양쪽 모두의 동적 형에 의존하고 있어서, 둘의 정보를 다 알고 있어야 한다. 함수는 그들중 하나의 가상 함수만을 부를수있다. 보다시피 확실한 해결책이 아니다.
         가상 함수는 single-dispatch로 구현된다. 이것은 우리가 구현하는 것에 반쪽에 불과하다. 그리고 컴파일러는, 이런 가상함수를 지원할수 있다. 그래서 가상함수인 collid를 GameObject내에 선언하는 것으로 시작해 보자. 이 함수는 유도되는 클래스에 의하여 오버라이드(overridden)된다.
         class GameObject {
          virtual void collide(GameObject& otherObject) = 0;
         class SpaceShip: public GameObject {
          virtual void collide(GameObject& otherObject);
          CollisionWithUnknownObject(GameObject& whatWeHit);
         void SpaceShip::collide(GameObject& otherObject)
         이러한 코드들은 캡슐화와 이별을 고한다. 왜냐하면 collide 함수는 그것의 모든 동급의 클래스-GameObject에서 상속된 클래스-들을 알고 있어야만 한다. 만약 새로운 형의 객체-새로운 클래스-가 게임에 추가된다면, 당신은 각각의 RTTI에 근거하여 if-then-else 체인을 프로그램 내부에 추가시켜야 할것이다. 만약 우리가 이것중 하나라도 까먹는다면, 프로그램은 모호한 버그를 가지게 된다. 게다가 컴파일러는 우리에게 이런 것을 찾는것에 관한 어떠한 도움도 지주 못한다.
         double-dispatch의 구현을 위해서 RTTI로의 접근할때,상속의 위험을 최소화하는 방법이 있다.(제일 처음꺼) 그렇지만 우리가 이전에 보았듯이, 특별히 아무것도 사용하지 않고, 변한 해결첵을 제시하지만 가상 함수이다. 이러한 적략 역시 RTTI가 접근하는 방식과 동일한 개념에서 시작하는 것이다. collide 함수는 GameObject의 가상 함수로 선언되고, 각 유도된 클래스에서 재 정의 되는 것이다. 거기에다가 각 클래스에다가 collide를 유도된 클래스의 구조에 따라 오버로드(overload)해버리는 것이다.
         class GameObject {
          virtual void collide(GameObject& otherObject) = 0;
         class SpaceShip: public GameObject {
          virtual void collide(GameObject& otherObject);
         기본 생각은 double-dispatch을 두개의 단일 dispatch로 구현하는 것이다. 다시 말해, 두개의 각기 다른 가상함수를 호출하는 것이다.; '''첫번째'''로 동적 형의 첫번째 객체를 결정한다. '''두번째'''로 두번째 객체를 결정한다. 이것을 하기전 전에, 처음 가상 함수의 호출의 collide 함수가 GameObject& 인자를 가진다. 해당 함수는 다음과 같이 간단히 구현된다.:
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