2016-11-30 2 views
0

J'ai cette 3ème définition de type de partie:Comment passer correctement un pointeur à une fonction membre pour un code tiers?

typedef void (*NexTouchEventCb)(void *ptr); 

qui est utilisé dans une fonction dans la bibliothèque 3ème partie:

void NexTouch::attachPop(NexTouchEventCb pop, void *ptr) 

Si j'ai un seul fichier .cpp je peux alors appeler avec succès la attachPop sans erreur du compilateur:

NexButton b0 = NexButton(0, 1, "b0"); 

void b0PopCallback(void *ptr) 
{ 
    // do something here 
} 

b0.attachPop(b0PopCallback, &b0); 

Mais je POO, j'ai donc mes propres fichiers d'en-tête et classe:

MyNextion.h

class MyNextion { 
    public: 
     void init(); 
     void b0PopCallback(void *ptr); 
    private: 
     NexButton *b0; 
} 

MyNextion.cpp

#include "MyNextion.h" 

void MyNextion::init() { 
    b0 = new NexButton(0, 1, "b0"); 
    b0->attachPop(/* what should I put here? */); 
} 

void MyNextion::b0PopCallback(void *ptr) { 
    // do something here 
} 

je suis passé par plusieurs questions similaires comme this, this et this un aussi. Mais je ne comprends pas.

Notez que ce code est compilé pour Arduino, qui est un microcontrôleur AVR. Les syntaxes C++ spéciales peuvent ne pas être disponibles.

Pouvez-vous s'il vous plaît me dire comment dois-je appeler b0->attachPop et pourquoi devrais-je appeler de cette façon?

S'il vous plaît noter que je ne suis pas en mesure de modifier la bibliothèque 3ème partie, qui se trouve ici: https://github.com/itead/ITEADLIB_Arduino_Nextion

+0

Je vais jeter un coup d'oeil sur cette question aussi. J'ai également ajouté une note que je compile pour Arduino qui est un microcontrôleur AVR. – papaiatis

+0

La duplication possbile ne mentionne pas les fonctions membres statiques à faire. – papaiatis

+0

Il y a beaucoup, beaucoup d'autres doublons possibles mais vous pouvez seulement signaler une question avec un. – MrEricSir

Répondre

2

Vous ne pouvez utiliser une fonction membre statique (ou fonction non-membre) de cette façon. Heureusement, votre API passe un pointeur void* supplémentaire où vous pouvez mettre l'objet que vous voulez appeler:

class MyNextion { 
public: 
    void init(); 
    void b0PopCallback(); 
private: 
    static void b0PopStaticCallback(void *ptr); 
    NexButton *b0; 
}; 

void MyNextion::b0PopStaticCallback(void *ptr) 
{ 
    static_cast<MyNextion*>(ptr)->b0PopCallback(); 
} 

void MyNextion::init() 
{ 
    b0 = new NexButton(0, 1, "b0"); 
    b0->attachPop(b0PopStaticCallback, this); 
} 
+0

Merci beaucoup! Je n'aurais jamais compris ça. – papaiatis