Вызов функции без явного обращения к ней, которая изменяется в зависимости от ввода

Я пытаюсь создать калькулятор скорости и времени, который будет максимально эффективным и хотел бы обратиться к функции, использующей указатель, который изменяется в зависимости от ввода, но я не уверен, как это сделать. Я пробовал много разных вещей:

Моя лучшая попытка:

// 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 ++ и мало что сделал с указателями / ссылками и памятью.

Редактировать: для справки, закончено, завершено код после исправлений — компилируется

2

Решение

Вы не включили 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 и т.д. были статический Вместо этого, вы можете использовать обычные указатели на функции, чтобы ссылаться на них.

5

Другие решения

Нестатическая функция не может быть вызвана без объекта. Ответь: можешь позвонить 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);
2

По вопросам рекламы [email protected]