2016-10-20 10 views
3

내부에 구형 및 캡슐의 객체가있는 3D 세계를 모델링하려고합니다. 모양 클래스가 기본 클래스이고 구체 클래스와 캡슐 클래스가 기본 클래스에서 상속받는 방식으로 모델링했습니다 (올바르게 구현 한 경우 완벽하게 가상 클래스입니다).기본 클래스를 매개 변수로 파생 클래스로 변환 할 수 있도록 함수 오버로드

class Shape 
{ 

protected: 
    COLORREF color; 

public: 
    virtual COLORREF getColor() =0; 


}; 


    class Capsule: public Shape 
{ 

private: 
    Point start; 
    Direction direction; 
    int dist, r; 
    //Color color; 
    //COLORREF color; 

public: 

    Capsule(Point start, Direction direction, int inputdist, int inputr, COLORREF inputcolor); 

    COLORREF getColor(); 

}; 

    class Sphere : public Shape 
{ 

private: 
    int r; 
    Point p; 
    //Color color; 
    //COLORREF color; 

public: 
    Sphere(int x, int y, int z , int r, COLORREF inputcolor) ; 
    COLORREF getColor(); 
    Point getpoint(); 
    int getradius(); 
}; 

그렇다면 Sphere 객체에 대한 포인터 또는 Capsule 객체에 대한 포인터를 취하는 다른 클래스에 함수가 있습니다.

bool Collideswith(Sphere *s); 
bool Collideswith(Capsule *c); 

하지만 위의 기능 중 하나를 강제로 싶습니다은 내가

Shape *myshape = new Sphere(0,0,0,4, RGB(0,0,0)); 
if(myRay.Collideswith(myshape)) { blah... } 

호출 할 때 호출하지만 문제는 할 그 Collideswith는 캡슐에 대한 포인터에 걸리거나 포인터 구체에 있기 때문에 지금 당장이 포인터를 내가 가리키는 곳으로 가져 가려하지 않을 것입니다.이 포인터는 도형에 대한 포인터입니다.

셰이프 포인터를 전달한다는 사실을 바꿀 수는 없지만 Collideswith() 함수가 셰이프 포인터를 가져 오는 방법을 알아야합니다. (아마도 모양 포인터를 취하는 오버로드 된 함수를 작성하여 모양이 캡슐인지 또는 구형인지 어떻게 알 수 있습니까?)

모든 제안은 정말 감사하겠습니다.

class Shape { 

// ... 

    virtual bool CollidesWith()=0; 
}; 

를 그리고 각 사용자의 서브 클래스 중 하나를 구현 : 감사

+0

Collideswith() 메서드가있는 다른 클래스의 코드를 변경할 수 있습니까? 또는 Shape 관련 클래스 만 수정할 수 있다고 가정해야합니까? – yaobin

답변

3

Shape 클래스의 가상 메서드를 선언 이제

bool Sphere::CollidesWith() 
{ 
    // ... 
} 

bool Capsule::CollidesWith() 
{ 
    // ... 
} 

, 이들 각자가 그 중 하나를 호출해야 질문에 언급 된 다른 클래스의 다른 CollidesWith() 메소드는 단순히 this을 전달합니다. 필요한 경우

bool CollidesWith(Shape *s) 
{ 
     return s->CollidesWith(); 
} 

가상 방법은, 그들에게 당신이 필요로하는 다른 매개 변수를 사용하고 전달할 수 있습니다 : 당신이 그것을 좋아 느끼는 경우, 다른 오버로드를 구현할 수

. 예를 들어 가상 메서드는 예제에서 myRay 매개 변수를 사용할 수 있으며 각 하위 클래스는 원하는 코드 예제에서와 마찬가지로 정확히 myRay을 호출합니다.

+0

이 솔루션은 Shapes의 정의를 CollidesWith (이름을 지정하지 않았으므로 X로 지정)를 정의하는 클래스와 결합합니다. Shape은 X에 대해 알고 있다고 가정하고 Shape를 수정할 가능성을 가지고 있습니다. – alexc

+0

그래, 이건 실제로 해결 됐어! CollidesWith 함수를 기본 클래스 내부에 넣은 다음 CollidesWith 함수를 오버로드하여 Shape을 가져 와서 그 내부에있는 셰이프의 collideswith 함수를 실행한다고 생각하지 않았습니다. 도와 주셔서 대단히 감사합니다 –

+0

구식이되어 지거나 첫 번째 스 니펫에'CollidesWith'에'virtual' 키워드가 누락되어 있습니까? – Christophe