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. P>
Si quelqu'un sait expliquer ce terme à un simple profane, je serais vraiment reconnu. p>
7 Réponses :
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. P>
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. P>
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. P>
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. P>
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. P>
Lorsque vous envoyez quelque chose d'un rappel, vous l'envoyez un moyen de Adressage em> 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 p> et p> est que dans le premier instance vous envoyez le résultat em> de la fonction, tandis que dans la deuxième instance, vous envoyez la fonction elle-même em>. p> p>
Dans les termes simples, un rappel est un code que vous transmettez dans une autre méthode. P>
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. p>
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. p>
bonne chance! p>
P.s. J'étais la même chose: je codir c # depuis des années avant que je les ai vraiment compris. P>
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>
- Vous appelez un autre morceau de code LI>
- il fonctionne, peut-être calculer une valeur intermédiaire li>
- Il appelle votre code, peut-être vous donner cette valeur intermédiaire li>
- 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);
> 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.
in c ++ Décérez-vous boost :: fonction p>
http://www.boost.org/doc /Libs/1_39_0/doc/html/function.html p>
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>
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();
}