2013-10-07 2 views
0

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

Combination.h (экстракт)

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 (экстракт)

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 (экстракт)

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

Выход:

Lookup 
Recursive 

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

Заранее благодарю вас за помощь!

+0

Для C++, вы можете посмотрите ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function). Это позволяет использовать функции-члены и лямбда-выражения. –

ответ

3

Как всегда, каждый .cpp-файл, который содержит Combination.h, имеет свою собственную переменную staticchoose. Ваш код в main обновляет копию main.cpp, но не версию в Combination.cpp.

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

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

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

long (*choose)(int, int) = chooseRecursive; 
+0

Спасибо, это то, что я подозревал. Есть ли способ сделать 'выбирать' глобальную переменную, которая является общей для всех? –

+0

@AndrewBaker Наши изменения должны быть перекрыты. Я обновил свой ответ, чтобы изменить «Choose» на глобальный – simonc

Смежные вопросы