2013-09-08 3 views
0

Я хочу иметь список объектов, связанных их базовым классом. Поэтому у меня будет класс, который управляет всеми различными вкусами объектов, но равномерно хранится в форме базового класса. Я хочу иметь возможность обрабатывать тестовое столкновение между двумя объектами, одним из которых является сфера, а другой - с кубом. Я бы назвал функцию вроде so sphere-> collisionTest (куб). Используя полиморфизм, я могу вызвать метод collisionTest и перейти к соответствующему методу в классе сфер, но мне нужен способ идентифицировать/переопределять метод collisionTest в классе сфер. Параметр, переопределяющий сферу. CollisionTest (сфера) или sphere.collisionTest (куб). Вот пример кода, который я пробовал. Здесь, когда я вызываю метод collisionTest (object-> getObject()), я считаю, что должен получить объект куба, а затем он переопределит параметр и вызовет метод collisionTest (объект Cuboid *). Вместо этого он вызывает тот же объект collisionTest (объект Geom *).Обращение с объектами

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; 
} 
+0

Я не думаю, что вы можете это сделать, потому что только метод collisionTest, который принимает объект Geom, можно переопределить. Ваш объект Geom не знает, что такое столкновение с кубом, и поэтому его не называют. – VoidStar

ответ

1

То, о чем вы спрашиваете, называется «двойная отправка», которую Google. К сожалению, нет простого и чистого способа сделать двойную отправку на C++. Обычный способ заключается в том, чтобы каждый тип геометрии возвращал перечисление, указывающее его тип; то вы можете просто включить перечисление типа, возвращаемое объектом, static_cast it, и вызвать соответствующую функцию.

+0

Да, это то, что я делал раньше, но хотел получить более элегантное решение, которое почти невозможно сделать, чтобы узнать. – OctopusPrime314

+0

Есть решения, которые разработчик программного обеспечения может назвать «элегантным». Но они не то, что программист назвал бы «хорошей идеей». – Sneftel

+0

в следующем ответе я покажу, если это то, что означает u – OctopusPrime314

0

Это то, что вы подразумеваете под нумерованным типом?

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

} 
}