Donc, je travaille actuellement sur un gestionnaire d'entrée pour un jeu C ++. Je pensais à le faire comme une carte Problème est fait de même que je dois spécifier l'instance que je souhaite appeler la méthode de. Existe-t-il un moyen de tenir à l'intérieur d'une variable non seulement de la méthode mais de l'instance de l'appelant? P> quelque chose comme: p> et cela appellerait est-il possible? P> Sinon, quelqu'un pourrait-il me dire à un schéma d'auditeur d'événements? Ne doit pas être surchargé ou threadsafe. Juste la structure de base. P> p>
FOOOBJECT CODE> 'S
DOSMATHIAT () CODE> P>
4 Réponses :
Il n'y a pas de "méthode d'une instance spécifique".
donné p> n'importe quelle classe peut contenir un pointeur sur la fonction code> DOSOMOD code> de la fonction (vous l'appelez une méthode) . P> Foo foo = <some function call>;
(foo.*fPtr)();
Oui, j'étais au courant de cette fonctionnalité! J'essayais d'éviter cela, donc je n'avais pas besoin d'avoir à la fois un pointeur au membre et l'instance pour "construire" un appel complet à une méthode à partir d'une instance spécifique. Merci de toute façon pour le nettoyer! Je vais voir ce que je peux faire!
Le problème avec les points de la fonction membre est que vous avez besoin d'une instance de la classe pour les appeler. Vous ne pouvez pas y parvenir à un pointeur, car le pointeur ne pointe que sur la fonction, et non l'objet supplémentaire que vous devez passer à la fonction (rappelez-vous que toutes les fonctions membres ont un premier paramètre implicite qui prend le type de classe).
Vous pouvez utiliser un std :: fonction code> pour avoir un objet de fonction qui contient l'objet à appeler et la fonction à l'appeler. Si vous avez P>
std::function<void()> func = [&](){ return fooObject.DoSomething(); }; // Bind with a reference. Use this if the object will live as long as the function to save on a copy
std::function<void()> func = [=](){ return fooObject.DoSomething(); }; // Bind with a copy. Use this if the function will outlive the object
Ainsi, voyant cela, je photographie faire une "liste de liaison" à l'aide d'un mappe
@Amonthornton c'est ce que je suggère. Lorsque vous créez la carte, vous créez une liste de la liste de toutes les fonctions souhaitées que ce caractère soit associé. Faites attention à la durée de vie de l'objet. Je suggérerais de commencer par capturer par copie au début pour vous assurer qu'il fonctionnera, puis vous pouvez inspecter le code pour voir si la capture par référence irait bien.
Vraiment sympa et serviable! Je vais y arriver tout de suite, merci beaucoup!
Y a-t-il un moyen de tenir à l'intérieur d'une variable non seulement de la méthode mais de l'instance de l'appelant? P>
Oui, vous pouvez Bind em> méthode et objet ensemble. p>
puisque c ++ 11 em> vous avez
lidez code>
utilitaire. p>
Exemple minimal de votre concept: p>
xxx pré> Code Godbolt < / p>
soyez prudent parce que «l'objet Bind» (
fn code> dans mon exemple) stockera simplement une référence référence em> à l'objet
FOO < / code>. Par conséquent, si vous invoquez
fn code> après que l'objet
foo code> a été détruit, vous obtiendrez un comportement indéfini em>. P>
Si vous souhaitez vous occuper de la durée de vie de l'objet, vous pouvez le copier avec une fonction Lambda. Par exemple: p>
xxx pré> ou utilisez une structure personnalisée et stockez un objet copié à l'intérieur. P> blockQquote>
C'est à peu près comment je l'ai imaginé! Merci!
Vous pouvez utiliser le lidez code> -Fonctionnalité pour obtenir l'objet de la fonction ayant des paramètres de fonction déjà liés aux arguments. De par là, vous pouvez lier la référence d'objet, qui est implicitement le premier paramètre de toute fonction de membre non statique, à l'objet respectif pour lequel vous souhaitez avoir le rappel:
1
2