2016-10-20 11 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(); 
}; 

そしてIは、球体オブジェクトへのポインタまたはカプセルオブジェクトへのポインタのいずれかを取り込む異なるクラスの機能を有します。

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... } 

呼び出すときに呼び出される上記の機能の1を強制したいと思います。しかし問題は、ときCollideswithだけ、球にカプセルまたはポインタへのポインタになりますので、ということです私は今、それがシェイプへのポインタである、私が渡しているものへのこのポインタを取らないと呼んでいます。

シェイプポインタを渡しているという事実を変更することはできませんが、Collideswith()関数でシェイプポインタを取得する方法を理解する必要があります。 (多分、形状ポインタを取り、形状がカプセルか球かどうか分かるオーバーロードされた関数を作成することによって)

何か提案は本当に感謝しています。 おかげ

+0

Collideswith()メソッドを持つ他のクラスのコードを変更できますか?または、Shape関連のクラスのみを変更できるとしますか? – yaobin

答えて

3

はあなたのShapeクラスの仮想メソッド宣言します。

class Shape { 

// ... 

    virtual bool CollidesWith()=0; 
}; 

をそして、あなたのサブクラスのそれぞれに実装:

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

関連する問題