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 ++のコールバック関数

std::tr1::function(一般化されたコールバック)を使用することをお勧めします

于 2012-10-18T14:47:05.380 に答える
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 に答える