Re: Double dispatch (makes no sense!)
saneman wrote:
...
class Box : public geometry_type
{
public :
Box() {}
virtual void haps(geometry_type* other)
{
other->collideWith(this);
}
virtual void collideWith(Sphere* other) {
std::cout << "Sphere collision with Sphere" << std::endl;
Huh? This should be "Box collision with Sphere", shouldn't it?
}
virtual void collideWith(Box* other) {
std::cout << "Box collision with Box" << std::endl;
}
};
class Sphere : public geometry_type
{
public :
Sphere() {}
virtual void haps(geometry_type* other)
{
other->collideWith(this);
}
virtual void collideWith(Sphere* other) {
std::cout << "Sphere collision with Sphere" << std::endl;
}
virtual void collideWith(Box* other) {
std::cout << "Sphere collision with Box" << std::endl;
}
};
void narrow_phase(geometry_type* G1, geometry_type* G2)
{
G1->haps(G2);
}
int main()
{
Box* BoxA = new Box();
Sphere* SphereA = new Sphere();
BoxA->collideWith(BoxA);
SphereA->collideWith(BoxA);
// Should print box collide with box.
narrow_phase(BoxA, BoxA);
// Should print sphere collide with box.
narrow_phase(SphereA, BoxA);
No. Your 'haps' method essentially "swaps" the objects involved in the
collision (take a closer look at it): 'G1' from 'narrow_phase' becomes
'this' in 'haps'. So, it should print "Box collision with Sphere". And
it will, if you fix the error mentioned above.
// Should print box collide with sphere.
narrow_phase(BoxA, SphereA);
Again, no. For the very same reason it should print "Sphere collision
with Box". And that exactly what it prints.
return 0;
}
But when I run main I get:
Box collision with Box
Sphere collision with Box
Box collision with Box
Sphere collision with Sphere
Sphere collision with Box
What goes on in the last two calls?
See above.
--
Best regards,
Andrey Tarasevich