Hvordan bruke funksjonspekere i C ++

En funksjon pekeren er i hovedsak bare en peker til en funksjon. I språk som C ++, finnes hver funksjon og variabel i et dataprogram som en minneadresse, og en variabel kan inneholde verdien av den aktuelle adressen. Det variable kan sendes til en tilbakeringing, som deretter kaller funksjonen at de variable peker til. Den kan også brukes i en hendelse manager, eller for sen binding av et medlem funksjon. På grunn av deres kompliserte syntaksen, blir funksjonspekere ofte unngås ved å programmerere, men kan brukes til å enkelt utføre mange kraftige oppgaver.

Bruksanvisning

1 Skriv en C ++ program. Dette er programmet der du vil bruke en funksjonspeker.

2 Definer en funksjonspeker. Du kan gjøre dette på flere måter. Erklære en funksjon, for eksempel:

void doSomething (int data)

og senere erklære en peker til den. Eller du kan erklære en funksjon som en peker:

void (* doSomething) (int)

Til slutt kan du erklære en typedef, og deretter opprette en variabel av den typen.

typedef void (* voidTakingInt) (int)

Nå kan du bruke \ "voidTakingInt \" som en type:

void doSomething (int data)

voidTakingInt fun_ptr = & doSomething;

3 Erklærer noe som bruker funksjonspeker. Dette vil ofte være noe som bruker funksjonspeker som en tilbakeringingsfunksjonen, slik at når det oppstår en bestemt hendelse, funksjonen går din funksjon. Et eksempel er en fil-lasting funksjon som tar et tilbakeringingsfunksjonen for å vise fremgang.

4 Kaller funksjonen fra pekeren til det. Dette vil bli gjort i funksjonen du skrev som godtar en funksjonspeker som et parameter:

void doSomething (int data) {
}

void callAnotherFunction (void (* otherFunction) (int)) {

(* OtherFunction) (3)

}

int main (int argc, char * argv []) {

callAnotherFunction (& doSomething)

returnere 0

}

Hint

  • I objektorientert programmering, funksjoner er ofte medlemmer av en viss klasse. Non-statiske medlemsfunksjoner kan ikke sendes som funksjonspekere. En vanlig praksis er å passere stedet en peker til et objekt som kan deretter ringe den nødvendige medlem funksjon. En annen måte er å skape et statisk medlem funksjon som tar som en dataparameter, som ville bli brukt for å passere en forekomst av objekttypen. Dette kan deretter ringe den aktuelle medlemsfunksjonen. For eksempel:
  • // Dette ble erklært som statisk i MyClass spesifikasjonen
  • void MyClass :: callAnotherFunction (åpne * data) {
  • MyClass * eksempel = (MyClass *) (data)
  • intance-> doSomething ()
  • }