Переключение между реализациями функций с помощью указателей функций

0

У меня есть две версии функции C, которые обмениваются друг с другом с точки зрения скорости и использования памяти. Эти функции находятся в файле.cpp, который используется совместно несколькими программами. Я хочу использовать указатель на функцию, чтобы я мог переключаться между двумя реализациями и выполнять эти изменения во всех файлах моей программы.

Combination.h(extract)

long chooseRecursive (int n, int r);
long chooseLookup (int n, int r);
void foo (int n, int r);
static long (*choose)(int, int) = chooseRecursive;

Combination.cpp(extract)

long chooseRecursive (int n, int r) { cerr << "Recursive\n"; }
long chooseLookup (int n, int r) { cerr << "Lookup\n"; }
void foo (int n, int r) { choose(n, r); }

Main.cpp(extract)

int main(int argc, char* argv []) {
    choose = chooseLookup;
    choose(10, 5);
    foo(10, 5);
}

Выход:

Lookup
Recursive

Почему функция foo не использует selectLookup вместо selectRecursive? Как это исправить? Есть ли лучший подход, который я могу использовать для достижения той же цели?

Заранее спасибо за вашу помощь!

Теги:
function-pointers

1 ответ

3
Лучший ответ

При существующем положении вещей, каждый файл.cpp, который включает в себя Combination.h имеет свой собственный static переменной choose. Ваш код в main обновлениях копирует main.cpp, но не версию в Combination.cpp.

Один простой способ исправить это - изменить Combination.h, чтобы объявить choose как extern

extern long (*choose)(int, int);

затем реализовать/инициализировать это в Combination.cpp

long (*choose)(int, int) = chooseRecursive;
  • 0
    Спасибо, это то, что я подозревал. Есть ли способ choose глобальную переменную, которая используется везде?
  • 0
    @AndrewBaker Наши правки должны были совпадать. Я обновил свой ответ , чтобы покрыть изменение choose , чтобы быть глобальным

Ещё вопросы

Сообщество Overcoder
Наверх
Меню