Я пытаюсь создать калькулятор скорости и времени, который будет максимально эффективным и хотел бы обратиться к функции, использующей указатель, который изменяется в зависимости от ввода, но я не уверен, как это сделать. Я пробовал много разных вещей:
Моя лучшая попытка:
// Inside class Math
double calcSpeed(double distance, double time); // These functions return a double value of the formula (non static)
double calcDistance(double speed, double time);
double calcTime(double speed, double distance);
// Inside Main
typedef double (Math::*FuncChosen)(double first, double second);
FuncChosen p = &Math::calcSpeed; // This changes according to input to different functions in Math class with same parameter types and return types
p(1, 2); // Not a function, how can I non explicitly call the function?
Есть ли способ вызвать эту функцию без явной ссылки на нее с помощью указателей или иным образом. Как вызов функции из указателя, который изменяется в зависимости от ввода?
Я действительно не знаю, с чего начать и что использовать, поскольку все, что я пытаюсь, является незаконным. Я в основном хочу выбрать функцию во время выполнения, не используя несколько ifs и, таким образом, избегая повторения. (Я нашел людей с похожими проблемами, но не нашел эффективного способа сделать это для моих целей.)
Заранее спасибо,
И да, я новичок в C ++ и мало что сделал с указателями / ссылками и памятью.
Редактировать: для справки, закончено, завершено код после исправлений — компилируется
Вы не включили MCVE, но комментарии и код указывают, что функции являются нестатическими функциями-членами внутри класса Math
, Тип FuncChosen
это указатель на функцию-член.
Указатели на участников — странные звери. На самом деле это не указатель, поскольку он не указывает ни на что напрямую. Думайте о указателе на член как об «идентификаторе в классе». Так, p
идентифицирует конкретную функцию-член (например, calcSpeed
). Точно так же, как вы можете обычно вызывать функцию-член, только вызывая ее для объекта, вам нужно предоставить объект для вызова через указатель на член. Так, например, если у вас есть этот код:
Math m;
double res = m.calcSpeed(1.0, 2.0);
Тогда эквивалент с указателем на член p
было бы:
Math m;
FuncChosen p = &Math::calcSpeed;
(m.*p)(1.0, 2.0);
Оператор .*
(и соответствующий ->*
) используются для разыменования указателя на член.
Для полноты: вышесказанное относится к нестатическим функциям-членам. Если calcSpeed
и т.д. были статический Вместо этого, вы можете использовать обычные указатели на функции, чтобы ссылаться на них.
Нестатическая функция не может быть вызвана без объекта. Ответь: можешь позвонить calcSpeed
как это?
calcSpeed(10.4, 444.0);
Нет, потому что ему нужен объект слева.
Math o;
o.calcSpeed(10.4, 444.0);
Вы можете хранить адрес этого метода, но вы должны вызывать его, используя объект:
(o.*p)(10.4, 444.0);
ДОБАВЛЯТЬ
Если на объект ссылается указатель (Math* po = &o;
), ->*
Оператор должен быть использован:
(po->*p)(10.4, 444.0);
Который такой же как:
((*po).*p)(10.4, 444.0);