1

我想知道,如何在我定义一个函数的地方创建一个函数。然后我可以调用定义的函数。让我举个例子。

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

我希望你明白我在这里想要做什么。但我不知道如何把它归结为正确的代码:-)

4

3 回答 3

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()可以使用该状态),但在您的情况下,函数指针可能同样好。

于 2012-10-18T14:43:11.210 回答
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();
于 2012-10-18T14:43:27.570 回答
2

您要使用的是回调,并且已经回答了她:Callback functions in c++

我建议你使用std::tr1::function(广义回调)

于 2012-10-18T14:47:05.380 回答