0
votes

C ++: pointeur de fonction qui contient une méthode d'une instance spécifique

Donc, je travaille actuellement sur un gestionnaire d'entrée pour un jeu C ++. Je pensais à le faire comme une carte > , de sorte que lorsque j'inscrite un bouton enfoncé, j'appelle toutes les méthodes enregistrées pour la clé spécifique.

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?

quelque chose comme: xxx

et cela appellerait FOOOBJECT 'S DOSMATHIAT ()

est-il possible?

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.


0 commentaires

4 Réponses :


0
votes

Il n'y a pas de "méthode d'une instance spécifique".

  1. Vous pouvez contenir un pointeur sur une fonction membre d'une classe. Ces pointeurs ne sont pas liés à un objet spécifique. Li>
  2. Vous pouvez utiliser ce pointeur de fonction sur n'importe quel objet de la classe. LI> ol>

    donné p> xxx pre>

    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)();
    


1 commentaires

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!



3
votes

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


3 commentaires

Ainsi, voyant cela, je photographie faire une "liste de liaison" à l'aide d'un mappe >> alors quand j'accède à une paire, je peux appeler toutes les fonctions de leurs instances appropriées associées à un personnage. Suis-je loin ou est-ce une façon possible de le faire?


@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!



1
votes

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?

Oui, vous pouvez Bind méthode et objet ensemble.

puisque c ++ 11 vous avez lidez utilitaire.


Exemple minimal de votre concept: xxx

Code Godbolt < / p>


soyez prudent parce que «l'objet Bind» ( fn dans mon exemple) stockera simplement une référence référence à l'objet FOO < / code>. Par conséquent, si vous invoquez fn après que l'objet foo a été détruit, vous obtiendrez un comportement indéfini .


Si vous souhaitez vous occuper de la durée de vie de l'objet, vous pouvez le copier avec une fonction Lambda. Par exemple: xxx

ou utilisez une structure personnalisée et stockez un objet copié à l'intérieur.


1 commentaires

C'est à peu près comment je l'ai imaginé! Merci!



0
votes

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


0 commentaires