Braquer une variable à une fonction membre en C ++

Il est surprenant de constater que la plupart des programmeurs C ++ ont aucune idée que un pointeur appelé ce existe. Ainsi ce est un grand secret! Revel en elle! Quel est le secret? Le secret est que vous pouvez prendre l'adresse de la fonction de membre d'un objet afin que vous puissiez accéder directement aux données d'instance de fonction de membre. Ooh-wee!

Maintenant, rappelez-vous que chaque instance d'une classe obtient sa propre copie des variables membres, à moins que les variables sont statiques. Mais les fonctions sont partagées dans toute la classe. Oui, vous pouvez distinguer les fonctions statiques de fonctions non statiques.

Mais que se réfère simplement à ce types de variables qu'ils accèdent: fonctions statiques peuvent accéder aux variables membres seulement statiques, et vous ne devez se référer à eux avec une instance. Nonstatic (à savoir, normale, régulière) Fonctions membres travaillent à une instance particulière. Cependant, à l'intérieur de la mémoire, en réalité qu'une seule copie de la fonction existe.

Alors, comment la fonction de député sait quelle instance de travailler avec? Un paramètre secret est transmis à la fonction de membre: le ce pointeur. Supposons que vous avez une classe appelée Gobstopper qui a une fonction membre appelée Chew (). Ensuite, vous avez une instance appelée MyGum, et vous appelez le Chew () fonction comme ceci:

MyGum.Chew () -

Lorsque le compilateur génère du code d'assemblage pour cela, il passe effectivement un paramètre dans la fonction - l'adresse du MyGum Ainsi, également connu comme le thispointer. Par conséquent un seul Chew () fonction est dans le code, mais l'appeler, vous devez utiliser un cas particulier de la classe.

Parce que seule une copie du Chew () fonction est en mémoire, vous pouvez prendre son adresse. Mais pour cela, il faut une sorte de code cryptique prospectifs. Ici, il est, rapide et au point. Supposons que votre classe ressemble à ceci:




Gobstopper de classe {public: int WhichGobstopper-Chew int (string name) {cout lt; lt; WhichGobstopper lt; lt; endl-cout lt; lt; nom lt; lt; endl-retour WhichGobstopper -}} -

La Chew () fonction prend une chaîne et renvoie un entier. Voici une typedef pour un pointeur vers la Chew () fonction:

typedef int (Gobstopper :: * GobMember) (string) -

Et voici une variable du type GobMember:

GobMember func = Gobstopper :: Chew-

Si vous regardez de près la typedef, il ressemble à un pointeur de fonction régulière. La seule différence est que le nom de classe et deux colons précèdent l'astérisque. Autre que cela, il est un ancien pointeur régulière de fonction.

Mais alors un pointeur de fonction régulière est limitée à pointant vers des fonctions d'un ensemble particulier de types de paramètres et un type de retour, cette fonction pointeur part ces restrictions mais a une autre limitation: Il ne peut pointer vers des fonctions de membres au sein de la classe Gobstopper.

Pour appeler la fonction stockée dans le pointeur, vous devez disposer d'un cas particulier. Notez que dans l'affectation des FUNC dans le code plus tôt qu'il n'y avait pas exemple, juste le nom de la classe et de la fonction, Gobstopper :: Chew. Donc, pour appeler la fonction, saisir une instance, ajouter FUNC, et aller!

La FunctionPointer02 exemple illustré contient un exemple complet avec la classe, l'adresse de la fonction de membre, et de deux instances distinctes.

#comprendre #comprendre utilisant Gobstopper namespace std classe {public: int WhichGobstopper-Chew int (string name) {cout lt; lt; WhichGobstopper lt; lt; endl-cout lt; lt; nom lt; lt; endl-retour WhichGobstopper -}} - int main () {typedef int (Gobstopper :: * GobMember) (string) -GobMember func = Gobstopper :: Chew-Gobstopper inst-inst.WhichGobstopper = 10 Gobstopper autre-another.WhichGobstopper = 20- (inst * FUNC.) ("Greg W.") - (. * FUNC autre) ("Jennifer W.") -Retour 0-}

Vous pouvez le voir dans principal que d'abord vous créez le type de la fonction, que vous appelez GobMember, puis vous créez une variable, FUNC, de ce type. Ensuite, vous créez deux instances de la Gobstopper classe, et vous leur donnez chacun une différente WhichGobstopper valeur.

Enfin, vous appelez la fonction de membre, d'abord pour la première instance et ensuite pour la deuxième instance. Juste pour montrer que vous pouvez prendre les adresses des fonctions avec des paramètres, vous passez dans une chaîne avec quelques noms.

Lorsque vous exécutez le code, vous pouvez voir à partir de la sortie qu'elle est en effet appelle la fonction membre correcte pour chaque instance:

10Greg W.20Jennifer W.

Maintenant, quand vous dites “ la fonction de membre correcte pour chaque instance, n ° 148; ce que vous vraiment dire est que le code appelle la même fonction de membre à chaque fois, mais en utilisant une instance différente. Si vous pensez en termes orientés objet, considérer chaque cas comme ayant sa propre copie de la fonction de membre. Par conséquent, il est correct de dire “. La fonction de membre correcte pour chaque instance ”


» » » » Braquer une variable à une fonction membre en C ++