В настоящее время я работаю над физическим движком-любителем для школьного проекта, но застрял из-за проблемы C ++.Настройки следующие:
У меня есть три разных класса:
- RigidBody (аннотация)
- Сфера (наследуется от RigidBody)
- CustomRigidBody(наследует от RigidBody и представляет многогранник)
Мне нужно проверить, не происходит ли столкновение между парой тел двумя одноименными методами.Один используется для проверки контакта со сферой, тогда как другой используется для проверки контакта с CustomRigidBody.Существует несколько возможных сценариев (столкновение «Сфера / сфера», столкновение «сфера / пользовательский» и т. Д.), Поэтому эти два метода определены во всех этих классах.
В RigidBody они абстрактны:
virtual bool isCollidingWith(Sphere* s_p) = 0;
virtual bool isCollidingWith(CustomRigidBody* rb_p) = 0;
Но не в сфере:
bool isCollidingWith(Sphere* s_p);
bool isCollidingWith(CustomRigidBody* rb_p);
Ни в CustomRigidBody:
bool isCollidingWith(Sphere* s_p);
bool isCollidingWith(CustomRigidBody* rb_p);
В моей основной программе у меня есть std::vector<RigidBody*>
, содержащий указатели на RigidBodies (суперкласс) и мне нужно проверить наличие коллизий между объектами по паре, вызвав что-то вроде:
for(int i = 1; i < this->bodies_p.size(); ++i)
for(int j = 0; j < i; ++j)
if(this->bodies_p[i]->isCollidingWith(this->bodies_p[j]))
std::cout << " COLLISION BETWEEN " << i << " AND " << j << std::endl;
У меня сложилось впечатление, что C ++ будет в порядке с этим, но я получаю следующее сообщение об ошибке:
Engine.cc:35: error: no matching function for call to ‘RigidBody::isCollidingWith(RigidBody*&)’
RigidBody.h:53: note: candidates are: virtual bool RigidBody::isCollidingWith(Sphere*)
RigidBody.h:54: note: virtual bool RigidBody::isCollidingWith(CustomRigidBody*)
Я предполагаю, что это связано с тем, что вектор тел содержит указатели на RigidBodies, и они не автоматически приводятся к Sphere * или CustomRigidBody *, но я не знаю, как решить проблему.
Спасибо за вашу помощь;)