У исходного программиста была эта идея, которая, кажется, работает на любом компиляторе, который он использовал, но не работает так хорошо в VS C ++. Практика выглядит очень сомнительной для меня.
У него есть базовый класс c, называемый mathObject
, который имеет много общих математических функций. Кроме того, у него есть класс с именем Cosmos
, а поверх него еще один класс с именем QuintCosmos
.
Общая идея заключается в том, что он хочет вызвать функцию-член с такой же сигнатурой из либо Mathobject
, либо Cosmos
, либо QuintCosmos
. Он пытается привести его к
typedef void (Mathobject::*moDerivs) (const double, const double*, double*)
Итак, подведем итог, он может иметь функцию с этой сигнатурой в любом месте этой иерархии, и он хочет рассказать третьему классу (обыкновенное дифференциальное уравнение, ODE, Solver), использовать функцию с этой подписью.
hnext = Miscmath::odeint(&QuintCosmos::propagateHistoryInTau, this);
В методе odeint()
он вызывает эту функцию следующим образом.
double Miscmath::odeint(moDerivs derivs, Mathobject* mo)
{
(mo->*derivs)(x, y, dydx);
}
Не удается скомпилировать в VS C ++ с
ошибка C2664: 'double Miscmath :: odeint (moDerivs, Mathobject *)': невозможно преобразовать аргумент 1 из 'void (__thiscall QuintCosmos :: *) (const double, const double *, double *)' to 'moDerivs'
Первоначальный автор пытался привести указатель функции с помощью (moDerives)
следующим образом:
hnext = Miscmath::odeint((moDerivs)&QuintCosmos::propagateHistoryInTau, this);
Это позволяет его компилировать, но во время выполнения происходит сбой с :
Исключение, выданное в 0x001E7148 в cmb-easy.exe: 0xC0000005: Место чтения нарушения доступа 0x0000006 C.
Итак, кто-нибудь знает, как чтобы выполнить sh this: выполнить функцию-член из базы се класс?