Я скажу, например, что у меня есть функция, называемая int compute (int x1, int x2, int (* op) (int, int)), которая принимает в качестве аргумента функцию указатель на функцию, которая выполняет некоторые арифметические операцииПреимущество указателей функций над флагами
int add (int a1, int a2)
{
return (a1 + a2);
}
int mul (int s1, int s2)
{
return (s1 * s2);
}
int compute (int x1, int x2, int (* op) (int, int))
{
return (op (x1, x2));
}
main()
{
int result;
int op1, op2;
op1 = 4;
op2 = 5;
result = compute (op1, op2, &add());
result = compute (op1, op2, &mul());
}
вместо всей этого указателе функции вещи, я могу также использовать флаги в качестве аргумента вместо указателя функции для достижения того же.
int compute (int x1, int x2, int opFlag)
{
if (opFlag == 1)
return (add (x1, x2););
if (opFlag == 2)
return (mul (x1, x2););
return 1;
}
main()
{
int result;
int op1, int op2;
op1 = 4;
op2 = 5;
result = compute (op1, op2, 1);
result = compute (op1, op2, 2);
}
Теперь вопрос, каковы (объявление/disad) недостатков; по «указателя функции» подход против «простого подхода флага» с точки зрения эффективности, размер кода, портативность, читаемость и т.д. .,?
Если вы используете флаги, и если вы хотите добавить больше функций, вы должны изменить код, чтобы добавить еще ' if'. –
С помощью указателя функции вы можете передавать другие алгоритмы без изменения или перекомпиляции 'compute'. –
Вы получаете возможность повторного использования с указателями функций. 'Compute()' может быть помещен в библиотеку и распространен среди других пользователей без необходимости обновления для поддержки новых операций. –