10
votes

Qu'est-ce qu'un rappel? Qu'est-ce que c'est et comment est-il implémenté par exemple C ++

Je me rends compte que c'est une question débutante, mais j'essaye d'apprendre C ++, je titus sur cette expression "rappel" fréquemment. J'ai googlé et j'ai vérifié Wikipedia, mais sans trouver une bonne explication. Je connais avec certains Java et C #, mais à quel point cela semble improbable, je n'ai jamais vraiment compris ce que signifie un rappel.

Si quelqu'un sait expliquer ce terme à un simple profane, je serais vraiment reconnu.


0 commentaires

7 Réponses :


3
votes

Ceci a votre réponse et votre code références: rappel


0 commentaires

3
votes

Un rappel est un raccordement dans le code qui s'exécute pour vous permettre de fournir des fonctionnalités personnalisées à des points connus dans le processus. Il permet aux structures de contrôle généralisées d'effectuer des opérations personnalisées spécifiées par votre code qui s'appelle à partir de ceux-ci, d'où le terme "rappel" - répondit dans votre code.

En règle générale, cela vous permet de fournir un pointeur de fonction avec une signature prédéfinie spécifique et le code générique effectuant le rappel transmettra des paramètres à votre fonction et attendez une valeur de retour d'un certain type.

C'est un modèle très puissant qui permet la réutilisation de code et une personnalisation / une extension assez simple sans ré-écriture complètement.

Les fonctions de tri personnalisées sont un excellent exemple. L'algorithme de tri est générique, la fonction de comparaison est spécifique à ce qui est trié. De nombreux algorithmes vous permettent de fournir une fonction qui prend deux arguments de types génériques, étant les objets à comparer et s'attend à ce que vous retourne une valeur de + ve, s -ve ou zéro en fonction du résultat du comparateur.

Vous écrivez vous-même la fonction Comaprison vous-même et fournissez un pointeur de fonction à l'algorithme de tri «rappelle» pendant le tri.


0 commentaires

5
votes

Lorsque vous envoyez quelque chose d'un rappel, vous l'envoyez un moyen de Adressage une fonction (par exemple, un pointeur de fonction en C ++) de sorte que le code que vous envoyez peut appeler cette fonction peut appeler cette fonction plus tard, quand il a terminé un processus.

la différence entre xxx

et xxx

est que dans le premier instance vous envoyez le résultat de la fonction, tandis que dans la deuxième instance, vous envoyez la fonction elle-même .


0 commentaires

2
votes

Dans les termes simples, un rappel est un code que vous transmettez dans une autre méthode.

E.g. Vous avez une classe A qui appelle une méthode de classe B mais vous avez besoin d'un code de code de classe A quand il est fini. Vous mettez votre code dans sa propre nouvelle méthode sur la classe A et vous passez le nom de la méthode dans la méthode de la classe B. Lorsque la méthode de la classe B a effectué ses affaires, il peut «rappeler» en classe A.

De nos jours, vous n'avez pas besoin de mettre le code de rappel dans sa propre méthode: vous avez des méthodes anonymes et des expressions Lambda que vous pouvez utiliser. Je pense que c'est probablement le moins déroutant (au moins, en C #) pour apprendre à utiliser des méthodes anonymes jusqu'à ce que vous l'obtenez.

bonne chance!

P.s. J'étais la même chose: je codir c # depuis des années avant que je les ai vraiment compris.


0 commentaires

16
votes

Je suis familière avec certains Java et C # P>

Un rappel est un événement ou un délégué dans ces langues - un moyen d'obtenir votre code em> exécuté par le code de quelqu'un d'autre dans son contexte. Par conséquent, le terme "rappel": p>

  1. Vous appelez un autre morceau de code LI>
  2. il fonctionne, peut-être calculer une valeur intermédiaire li>
  3. Il appelle votre code, peut-être vous donner cette valeur intermédiaire li>
  4. Il continue à courir, ce qui a finalement transmettre le contrôle à vous en complétant li> ol>

    Un exemple canonique est une routine de tri avec une fonction de comparaison définie par l'utilisateur (le rappel). Compte tenu d'une routine de tri telle que: p> xxx pré>

    (les spécificités de comment em> le tri n'est pas important - concentrez-vous simplement sur le fait que tout Le tri des algorithmes doit comparer 2 valeurs et déterminer qui est plus élevé.) p>

    Donc, nous pouvons maintenant définir certaines fonctions de comparaison: p> xxx pré>

    et réutiliser le même Fonction de tri avec eux: P>

    int intValues[10];
    Person personValues[10];
    
    Sort(intValues, 10, sizeof(intVaues[0]), CompareInts);
    Sort(personValues, 10, sizeof(personVaues[0]), ComparePersons);
    


1 commentaires

> Un rappel est un événement ou un délégué dans ces langues que le modèle d'observateur est également une construction qui émule un comportement ressemblant à un rappel.



0
votes

0 commentaires

0
votes

J'ai posté cette réponse pour une autre question, mais cela semble être tout aussi applicable ici.

Voici des moyens d'implémenter des rappels en C ++ de (environ) le plus flexible au moins: p>

Signaux et Slots h2>

Plusieurs signaux et machines implémentations sont répertoriés ici A > (notamment Boost.Signal). Celles-ci sont utiles pour implémenter le Observateur modèle de conception où plus d'un objet est intéressé par la réception de notifications. H2>boost.function.function.functiondleight peut enregistrer un boost :: fonction code> rappel. Boost :: Fonction Code> est enveloppé autour de toute entité appelable: fonction libre, fonction statique, fonction membre ou objet de fonction. Pour envelopper une fonction de membre, vous utilisez boost :: liaison code> comme indiqué dans cette exemple . EXEMPLE D'UTILISATION: P>

typedef void (*MouseCallback)(void* context); // Callback function pointer type

class Mouse
{
public:
    Mouse() : callback_(0), context_(0) {}

    void registerCallback(MouseCallback callback, void* context = 0)
        {callback_ = callback; context_ = context;}

    void notifyClicked() {if (callback_) callback_(context_);}

private:
    MouseCallback callback_;
    void* context_;
};

class Foo
{
public:
    void mouseClicked() {cout << "Mouse clicked!";}

    static void callback(void* context)
        {static_cast<Foo*>(context)->mouseClicked();}
};

int main()
{
    Mouse mouse;
    Foo foo;
    mouse.registerCallback(&Foo::callback, &foo);
    mouse.notifyClicked();
}


0 commentaires