2009-06-15 8 views
50

Próbuję wykonać funkcję, która ma postać, a następnie zwraca wskaźnik do funkcji w zależności od charakteru postaci. Po prostu nie wiem, jak sprawić, aby funkcja zwróciła wskaźnik do funkcji.Jak funkcja zwraca wskaźnik do funkcji? (C++)

+0

Czy podpis zwracanej funkcji zawsze będzie taki sam? –

+0

Oto podpis funkcji, która przyjmuje wskaźnik funkcji i zwraca jeden: http://en.cppreference.com/w/c/program/signal –

Odpowiedz

60
#include <iostream> 
using namespace std; 

int f1() { 
    return 1; 
} 

int f2() { 
    return 2; 
} 

typedef int (*fptr)(); 


fptr f(char c) { 
    if (c == '1') { 
     return f1; 
    } 
    else { 
     return f2; 
    } 
} 

int main() { 
    char c = '1'; 
    fptr fp = f(c); 
    cout << fp() << endl; 
} 
+0

Bardzo ładny przykład – Baget

+0

Zastanawiam się, dlaczego to działa. Czy nie powinniśmy najpierw pokłonić się wskaźnikowi funkcji, , tj. 'Cout << (* fp)() << endl;'? – qed

+2

@qed: Nie. Możesz go usunąć, ale nie możesz tego zrobić. Zazwyczaj funkcja wewnętrzna i tak jest już wewnętrznie wskaźnikiem. – xryl669

1

To jest kod pokazujący powrót wskaźnika funkcji. Trzeba zdefiniować "podpis funkcja", aby powrócić pierwszy:

int returnsOne() { 
    return 1; 
} 

typedef int(*fp)(); 

fp returnsFPtoReturnsOne() { 
    &returnsOne; 
} 

W Twoim konkretnym przypadku:

fp getFunctionFor(char code) { 
    switch (code) { 
     case 'a': return &functionA; 
     case 'b': return &functionB; 
    } 
    return NULL; 
} 
+1

Moje głosowanie jest takie, że chce zwrócić wskaźnik funkcji, a nie rzutować na void * i zwróć go. – CiscoIPPhone

+0

tak, moja pierwsza reakcja była szybka i brudna, naprawiłem ... teraz jadam wronę. –

15

utworzyć typedef dla podpisu funkcję:

typedef void (* FuncSig)(int param); 

Następnie zadeklarować funkcja jako zwrot FuncSig:

FuncSig GetFunction(); 
-1

Jestem zakładając tu C (bez obiektów) :):

// Type of function which takes a char and returns an int: 
typedef int (*Func)(char a); 

// An example of the function you're trying to return and which does something 
// with char: 
int exampleFunc(char a) 
{ 
    return (int)(a + 42); 
} 

// The function returning the pointer to a function: 
Func *returnAfunc(void) 
{ 
    return exampleFunc; 
} 
4
typedef void (*voidFn)(); 

void foo() 
{ 
} 

voidFn goo(char c) 
{ 
    if (c == 'f') { 
     return foo; 
    } 
    else { 
     //.. 
    } 
    // .. 
} 
1

Najprostszym sposobem jest typedef typu wskaźnik do funkcji, którą chcesz, a następnie użyć tego

typedef void (*fnptr_t)(int, int); 
fptr_t myfunc(char *) { .... 
1

Preferuję zwracane obiekty i dzwonię do operatora(). W ten sposób twoja funkcja może zwrócić interfejs i wszystkie klasy mogą z tego dziedziczyć. Oznacza to, że jeśli używasz C++ i nie C

Następnie można użyć parametryzowane metodę współczynnika zwrotu obiektów opartych na wejściu.

0

coś takiego

#include <iostream> 

typedef char (*fn_ptr_t)(char); 

char a_fn(char c) 
{ 
    return c + 1; 
} 

char b_fn(char c) 
{ 
    return c + 2; 
} 

fn_ptr_t 
return_function(char c) 
{ 
    fn_ptr_t result = 0; 

    switch (c) 
{ 
    case 'a': 
     result = a_fn; 
     break; 
    case 'b': 
     result = b_fn; 
     break; 
} 

return result; 
} 

int 
main() 
{ 
    fn_ptr_t fn = return_function('a'); 

    std::cout << "a(l) = " << (fn)('l') << std::endl; 

    return 0; 
} 
82
int f(char) { 
    return 0; 
} 

int (*return_f())(char) { 
    return f; 
} 

Nie, poważnie, używać typedef :)

+28

+1 za pokazanie, jak wygląda składnia bez typu. –

+0

Dobra odpowiedź, to pokazuje złożoność języka. – iammilind

+0

@Axalo Program kompiluje się w obecnej postaci. '' 'return_f''' nie przyjmuje żadnych argumentów, ale zwraca funkcję, która pobiera znak. – erikkallen

2

Oto jak to zrobić bez używania typedef:

int c(){ return 0; } 

int (* foo (void))(){ //compiles 
return c; 
} 
1

Składnia na powrót funkcji:

return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters) 

np Rozważmy funkcję, które muszą być zwrócone w następujący sposób:

void* (iNeedToBeReturend)(double iNeedToBeReturend_par) 
{ 
} 

Teraz funkcja iNeedToBeReturend mogą być zwracane jako

void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double) 
{ 
    return iNeedToBeReturend; 
} 

czułem się bardzo źle, aby dowiedzieć się tę koncepcję po 3 latach życia zawodowego programowania.

Premia za czekanie na wskaźnik funkcji dereferencji.

C++ Interview questions

Przykład funkcję, która zwraca wskaźnik funkcji jest dlopen in dynamic library in c++

1

C++ 11 można użyć spływu typu powrotne uproszczenie składni np zakładając funkcję:

int c(int d) { return d * 2; } 

To może być zwracana z funkcji (które trwa dwukrotnie, aby pokazać, że):

int (*foo(double e))(int) 
{ 
    e; 
    return c; 
} 

Korzystanie typ zwracanej spływu, to staje się nieco łatwiejsze do odczytania:

auto foo2(double e) -> int(*)(int) 
{ 
    e; 
    return c; 
}