2012-10-18 5 views
1

함수를 정의하는 함수를 만드는 방법을 알고 싶습니다. 그리고 정의 된 함수를 호출 할 수 있습니다. 제가 예를 들어 보도록하겠습니다.다른 함수에서 정의 된 함수를 호출하십시오. C++

void funcToCall() { 
    std::cout<<"Hello World"<<std::endl; 
} 

void setFuncToCall(void func) { 
    //Define some variable with func 
} 

void testFuncCall() { 
    //Call function that has been defined in the setFuncToCall 
} 

setFuncToCall(funcToCall()); //Set function to call 
testFuncCall(); //Call the function that has been defined 

나는 당신이 내가 여기서하려고하는 것을 이해하기를 바랍니다. 하지만 올바른 코드로 가져 오는 방법을 모르겠습니다. :-)

+0

을 사용해야합니다. 함수 포인터 –

+0

또는 std :: function – marcinj

답변

4

함수 포인터가 필요합니다. typedef 먼저 함수 포인터로 작업하는 것이 더 쉽습니다.

typedef void (*FuncToCallType)(); 

FuncToCallType globalFunction; // a variable that points to a function 

void setFuncToCall(FuncToCallType func) { 
    globalFunction = func; 
} 

void testFuncCall() { 
    globalFunction(); 
} 

setFuncToCall(funcToCall); //Set function to call,NOTE: no parentheses - just the name 
testFuncCall(); //Call the function that has been defined 

다른 답변으로는 기능과 같은 개체도 사용할 수 있다고 나와 있습니다. 그러나 이것은 연산자 오버로딩을 필요로하며 (심지어 숨겨진 채로 있어도) 일반적으로 템플릿과 함께 사용됩니다. 더 많은 유연성을 제공합니다 (객체를 함수에 전달하기 전에 객체에 어떤 상태를 설정할 수 있으며 객체의 operator()은 그 상태를 사용할 수 있습니다). 그러나 함수 포인터가 그럴 수도 있습니다.

는 함수 포인터에 대한
+0

이 필요합니다. 좋은 답변을 주셔서 감사합니다. :-) – PeterBechP

2

C 구문은 조금 이상한 , 그러나 여기에 우리가 간다 :

// this is a global variable to hold a function pointer of type: void (*)(void) 
static void (*funcp)(void); 
// you can typedef it like this: 
//typedef void (*func_t)(void); 
// - now `func_t` is a type of a pointer to a function void -> void 

// here `func` is the name of the argument of type `func_t` 
void setFuncToCall(void (*func)(void)) { 
// or just: void setFuncToCall(func_t func) { 
    //Define some variable with func 
    ... 
    funcp = func; 
} 

void testFuncCall(void) { 
    //Call function that has been defined in the setFuncToCall 
    funcp(); 
} 

setFuncToCall(funcToCall); // without() ! 
testFuncCall(); 
2

은 당신이 사용하고자하는 콜백이며, 그녀가 대답했습니다된다 Callback functions in c++

내가 권합니다 당신은 std::tr1::function (일반 콜백)

+0

예, 그것에 대해 생각 해보지 않았습니다. C++에 대한 내 대답보다 나은 선택입니다. –

관련 문제