2014-04-06 5 views
0

C++는 내가 객체 지향을 사용하는 광범위하게 사용했던 첫 번째 언어이므로이 아이디어에 조금 새로운 점이 있습니다. 저는 C++에서 Go (실제 OOP 시스템 대신 인터페이스를 사용하는)에서 작업하고 있던 게임 라이브러리를 이식하려고합니다.충돌 감지 시스템의 클래스 구조에 대한 조언

포인트, 경계, 선 및 다각형의 네 가지 유형을 사용하는 충돌 시스템이 있습니다. 제가하고 싶은 것은 이들 모두를 "Collider"클래스로 추상화 할 수 있고 두 개의 Collider 객체를 가져 와서 충돌을 테스트 할 수있는 기능을 가지고 있습니다. 이 후 원래

bool Collides(Collider obj1, Collider obj2); 

내가 다른 유형을 제공 충돌을 테스트 할 각 충돌 유형에 대한 방법 (즉, 방법 OnPoint, OnBounding, 온라인 및 OnPolygon)를 가질 수있다 생각하고 : 그것은 다음과 같이 보일 것입니다 "Collider"는 이러한 모든 메서드를 필요로하는 가상 클래스이지만, C++에서는 클래스가 서로 컴파일에 의존하기 때문에 불가능하다는 것을 깨달았습니다 (맞습니까?).

나는 내가 할 수있는 일에 대해 약간의 상실감이있다. 내 디자인 아이디어가 파이프 꿈일까요?

+0

왜 클래스가 서로 의존한다고 생각합니까? 그들 모두가 추상 클래스 인 Collider의 자식 클래스이고 그 모두가 그 클래스에 정의 된 메소드를 오버 라이드하는 경우, Collides 메소드는 인수의 구체적인 유형에 대해 걱정할 필요가 없다. – Ashalynd

+0

씬의 오브젝트가 충돌을 감지하도록하지 마십시오. "bool collision (const circle & const const Rectangle &)"와 같은 독립적 인 함수를 가지고있는 scene 객체가 있습니다. –

+0

좋아요, 어떤 형태의 Collides (Collider obj1, Collider obj2)를 만들기위한 최선의 방법은 무엇입니까? '함수가 충돌 객체의 조합을 받아들이도록 'Collides'에 과부하를 걸어야합니까? – Velovix

답변

1

원하는 것은 첫 번째 인수뿐만 아니라 두 번째 인수에도 이중 디스패치를 ​​전달하는 함수입니다. 이것은 C++에서 직접 지원되지 않지만 에뮬레이트 될 수 있습니다.

class Collider { 
public: 
    virtual bool Collides(Collider const& x) const = 0; 

private: 
    virtual bool Collides(Point const& p) const = 0; 
    virtual bool Collides(Line const& l) const = 0; 
}; 

class Point: public Collider { 
public: 
    virtual bool Collides(Collider const& x) const { 
     // here, the type of this is now Point 
     // now, find out what x is and call the overload on this type 
     x.Collides(*this); 
    } 

private: 
    virtual bool Collides(Point const& p) const { 
     // we now know that we are a point and checking vs. another point 
    } 

    virtual bool Collides(Line const& l) const { 
     // we now know that we are a point and checking vs. a line 
    } 
}; 

class Line: public Collider { 
public: 
    virtual bool Collides(Collider const& x) const { 
     // here, the type of this is now Line 
     x.Collides(*this); 
    } 

private: 
    virtual bool Collides(Point const& p) const { 
     // we now know that we are a line and checking vs. a point 
    } 

    virtual bool Collides(Line const& l) const { 
     // we now know that we are a line and checking vs. another line 
    } 
}; 

이제 확인이 객체는 두 개의 런타임 파견 할 것입니다 :

Collider* p = new Point(); 
Collider* l = new Line(); 

p.Collides(l) 
// first dynamically dispatches on p to call Point::Collides 
// in Collides, this (which is p) now has the static Point. 
// now do the second dispatch on l and use *this as the parametet 
// to find the overload. 

이것은 예입니다 Visitor design pattern에서 사용됩니다. 개체 집합이 고정되어 있지만 수행 된 작업이 변경되거나 확장 될 것으로 예상되는 경우 Visitor가 좋은 선택입니다.

+0

매우 흥미로운 해결책! 고맙습니다! – Velovix