2011-04-21 2 views
1

Est-ce possible? Si oui, je n'arrive pas à avoir la syntaxe correcte. (Pointeur de fonction C++)C++ Fonction Pointer

peu d'arrière-plan. Le code ci-dessous a été raccourci pour ce post. La raison de cette implémentation est d'éviter une liste infinie d'instructions SWITCH/CASE ou IF/ELSEIF; et avez une liste infinie de DECODER_FUNCTION_TABLE (voir ci-dessous). Ce code traite d'un standard de l'industrie qui utilise des mnémoniques pour signifier différentes choses et il y a des centaines de ces mnémoniques. Donc cette partie de mon code est de décoder certains mnémoniques qui lui passent d'une autre section de code qui boucle dans un enregistrement passé ... de toute façon ma difficulté est de garder un pointeur de fonction membre dans une structure en dehors de la classe ...

Jetez un oeil. Je pense que le code peut faire un meilleur travail expliquant;)

typedef struct _DECODER_FUNCTION_RECS 
{ 
    ISO_MNEMONIC_ID Mnemonic; 
    void (Database::*pFn)(Database::Rec *); 

}DECODER_FUNCTION_RECS; 


DECODER_FUNCTION_RECS DECODER_FUNCTION_TABLE[] = { 

    SFP, &Database::Decode_SFP, 
    KOG, &Database::Decode_KOG 
}; 


void Database::DecodedDescription(Rec *A) 
{ 

    int i = 0; 
    bool Found = false; 

    while(i < DECODER_FUNCTION_TABLE_COUNT && !Found) 
    { 
    if(DECODER_FUNCTION_TABLE[i].Mnemonic == A->Mnemonic) 
     Found = true; 
    else 
     i++; 
    } 

    if(Found) 
    (([DECODER_FUNCTION_TABLE[i]).*this.*pFn)(A); 

} 


void Database::Decode_SFP(Rec *A) 
{ 
    // do decode stuff on A 
} 

Le détail que je suis en train de travailler est cette ligne:

(([DECODER_FUNCTION_TABLE[i]).*this.*pFn)(A); 
+0

directe Découvrez cette réponse : http://stackoverflow.com/questions/1915880/boostbind-boostfunction-pointers-to-overloaded-or-type-member-function/1917145#1917145 – Paul

Répondre

5

Vous appelez un pointeur de fonction membre (c'est ce que il est appelé) avec

(this->*DECODER_FUNCTION_TABLE[i].pFn)(A); 

pourrait mettre parens autour DECODER_FUNCTION_TABLE[i].pFn, mais l'opérateur d'accès membre . a une priorité plus élevée que l'opérateur de fonction membre ->*.

+0

WOW! Réponse rapide! & Absolument correct aussi! Merci beaucoup. Merci pour l'explication aussi ... J'étais en train de bousiller l'opérateur d'accès membre ayant une plus grande priorité que l'opérateur de la fonction. – Eric

+0

@Eric: Rapide? Nah, c'était 8 minutes après que vous ayez demandé. :) J'étais perplexe que personne n'a encore répondu. ;) – Xeo