2013-10-07 3 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 함수가 chooseRecursive 대신 selectLookup을 사용하지 않는 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있습니까? 동일한 목표를 달성하는 데 사용할 수있는 더 나은 방법이 있습니까?

도움을 주셔서 감사합니다.

+0

이를 초기화 선언 Combination.h을 변경하는 것입니다

, 당신이 할 수 있습니다

['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function)을보십시오. 멤버 함수와 람다 식을 사용할 수 있습니다. –

답변

3

상황에 따라 Combination.h가 포함 된 각 .cpp 파일에는 static 변수 choose이 있습니다. main의 코드는 main.cpp의 복사본을 업데이트하지만 Combination.cpp의 버전은 업데이트하지 않습니다. 는이 문제를 해결하는 쉬운 방법 중 하나는 choose 다음

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

extern로하는/구현 C++에 대한 Combination.cpp

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

고마워요. 그게 내가 의심했던 것입니다. 어디에서나 공유되는 전역 변수를''선택 '할 수있는 방법이 있습니까? –

+0

@AndrewBaker 편집 내용이 겹쳐져 있어야합니다. 나는 세계화되기 위해 변화하는'choose'를 커버하기 위해 나의 대답을 업데이트했다. – simonc