0

基本クラスによってリンクされているオブジェクトのリストが必要です。したがって、オブジェクトのさまざまなフレーバーをすべて管理するが、基本クラスの形式で一様に格納されるクラスを作成します。球体と立方体の 2 つのオブジェクト間のテスト衝突を処理できるようにしたいと考えています。sphere->collisionTest(cube) のような関数を呼び出すと思います。ポリモーフィズムを使用すると、collisionTest メソッドを呼び出すことができ、球クラスの適切なメソッドに移動しますが、球クラス内のどの collisionTest メソッドを識別/オーバーライドする方法が必要です。sphere.collisionTest(sphere) または sphere.collisionTest(cube) をオーバーライドするパラメーター。これが私が試したコードの例です。ここで、collisionTest(object-> getObject()) メソッド 立方体オブジェクトを取得する必要があると思います。その後、パラメーターをオーバーライドして、collisionTest(Cuboid *object) メソッドを呼び出します。代わりに、同じ collisionTest(Geom *object) を呼び出します。

int main()
{
Geom *geomHandler1;// = new Geom();
Geom *geomHandler2;// = new Geom();

Sphere *sphereGeom = new Sphere();
Cuboid *cuboidGeom = new Cuboid();

geomHandler1 = (Geom*)sphereGeom;
geomHandler2 = (Geom*)cuboidGeom;

geomHandler1->collisionTest(geomHandler2);


return 0;
}



#include "Sphere.h"

void Sphere::collisionTest(Geom *object)
{
collisionTest(object->getObject());
}

void Sphere::collisionTest(Cuboid *object)
{

}

Sphere* Sphere::getObject()
{
Sphere *husk = new Sphere();
return husk;
}



#include "Cuboid.h"

void Cuboid::collisionTest(Geom *object)
{

}

void Cuboid::collisionTest(Sphere *object)
{

}

Cuboid* Cuboid::getObject()
{
Cuboid *husk = new Cuboid();
return husk;
}
4

2 に答える 2

1

あなたが尋ねていることは、「二重発送」として知られています。残念ながら、C++ でダブル ディスパッチを行う単純でクリーンな方法は実際にはありません。通常の方法は、各ジオメトリ タイプがそのタイプを示す列挙型を返すことです。次に、オブジェクトによって返された型列挙型をオンにし、それを static_cast して、適切な関数を呼び出すだけです。

于 2013-09-08T14:29:45.860 に答える
0

それが列挙型の意味ですか?

void Sphere::collisionTest(Geom *object)
{
switch (object->getID())
{
    case SPHERE : sphCollTest((Sphere*)object);
    break;
    case CUBOID : cubCollTest((Cuboid*)object);
    break;

}
}
于 2013-09-08T18:32:27.847 に答える