Comment puis-je mettre en œuvre un rappel en C++?

Je veux implémenter une classe en c++, qui a une fonction de rappel.

Donc je pense que j'ai besoin d'une méthode qui a 2 arguments:

  • l'objet cible. (disons
    *myObj)
  • le pointeur vers une fonction membre de
    l'objet cible. (afin que je puisse faire
    *myObj->memberFunc(); )

Les conditions sont les suivantes:

  • myObj peut être de toute la classe.
  • la fonction membre qui va être la fonction de rappel est non statique.

J'ai lu à ce sujet, mais il semble que j'ai besoin de connaître la classe de myObj avant de la main. Mais je ne suis pas sûr de savoir comment faire. Comment puis-je gérer cela? Est-ce possible en C++?

C'est quelque chose que j'ai à l'esprit, mais est certainement incorrecte.

class MyClassWithCallback{
public
    void *targetObj;
    void (*callback)(int number);
    void setCallback(void *myObj, void(*callbackPtr)(int number)){
        targetObj = myObj;
        callback = callbackPtr;
    };
    void callCallback(int a){
        (myObj)->ptr(a);
    };
};
class Target{
public
    int res;
    void doSomething(int a){//so something here. This is gonna be the callback function};        
};

int main(){
    Target myTarget;
    MyClassWithCallback myCaller;
    myCaller.setCallback((void *)&myTarget, &doSomething);

}

J'apprécie toute l'aide.

Merci.

Mise à JOUR
La plupart d'entre vous a dit de les Observer et de Délégation, bien que j'ai exactement ce que je recherche, je suis une sorte d'Objective-C/Cocoa d'esprit du mec.
Mon actuel de la mise en œuvre est l'utilisation des interfaces avec les fonctions virtuelles. Est juste que je pensais que ce serait plus "intelligents" juste à passer de l'objet et un membre de pointeur de fonction (comme boost!) au lieu de définir une Interface. Mais Il semble que tout le monde accepte que les Interfaces sont le moyen le plus facile à droite? Boost semble être une bonne idée, (en supposant que est installé)

Modèle observateur exige des changements dans les "observés" interface de classe, parfois, il est beaucoup plus simple et plus claire de l'utilisation function et bind au lieu d'interfaces. Notez également que si vous utilisez version récente de gcc, vous avez déjà function et bind donc pas besoin de coup de pouce. À l'aide de la fonction/bind est fonctionnelle la programmation des modèles tout en utilisant des interfaces est plus à l'aide de "standard" modèle de conception qui a un sens différent

OriginalL'auteur nacho4d | 2010-08-01