Quels sont le Pointeur de Membre ->* et .* Les opérateurs en C++?
Oui, j'ai vu cette question et cette FAQ (mauvais lien) cette FAQ, mais je encore ne comprends pas ce ->*
et .*
moyenne en C++.
Ces pages fournissent des informations sur les opérateurs (tels que la surcharge), mais ne semblent pas bien expliquer ce qu'ils sont.
Quels sont ->*
et .*
en C++, et quand avez-vous besoin de les utiliser comme comparé à ->
et .
?
- Je pense que cette FAQ il explique assez bien.
- Je ne peux pas croire que j'ai posté dans le mauvais lien. X___X c'est celui que je voulais poster, pas de MSDN! - Je l'ai regardé, mais je ne comprenais pas grand-chose. Tout ce qu'ils disent, c'est que "le type est différent", mais j'ai trouvé ce genre de confusion...
Vous devez vous connecter pour publier un commentaire.
J'espère que cet exemple sera de clarifier les choses pour vous
Maintenant, vous ne pouvez pas utiliser
x.somePointer()
, oupx->somePointer()
car il n'est pas membre de la classe X. Pour que la fonction de membre du pointeur de la syntaxe d'appel est utilisé... juste essayer quelques exemples vous-même ,vous allez en prendre l'habitudepointer
différents à partir d'un pointeur de fonction qu'il nécessite une syntaxe différente? (par exemple, Est-il plus grand?)&X::f
œuvres? Voir this question.EDIT: En passant, c'est bizarre pour membre virtuel des pointeurs de fonctions.
Pour les variables membres:
Fonctions membres sont presque les mêmes.
En un mot: Vous utilisez
->
et.
si vous savez ce membre auquel vous souhaitez accéder. Et vous utilisez->*
et.*
si vous ne pas savoir ce membre auquel vous souhaitez accéder.Exemple avec un simple intrusive liste
Dite de "pointeurs" pour les membres en C++ sont plus comme des décalages, en interne. Vous avez besoin d'un membre de "pointeur", et un objet, pour faire référence au membre dans l'objet. Mais membre de "pointeurs" sont utilisés avec le pointeur de la syntaxe, d'où le nom.
Il y a deux façons vous pouvez avoir un objet à portée de main: vous avez une référence à l'objet, ou si vous avez un pointeur vers l'objet.
Pour la référence, l'utilisation
.*
de le combiner avec un pointeur de membre, et pour le pointeur, utilisation->*
de le combiner avec un pointeur de membre.Cependant, en règle générale, ne pas utiliser de pointeurs si vous pouvez l'éviter.
Ils obéissent assez contre-intuitive, les règles, et elles permettent de contourner
protected
d'accès sans aucun explicite de la coulée, qui est, par inadvertance...Cheers & hth.,
Vous ne pouvez pas déréférencement de pointeur comme normal pointeurs — en raison des fonctions de membre du besoin
this
pointeur, et vous devez passer en quelque sorte. Donc, vous avez besoin d'utiliser ces deux opérateurs, avec l'objet sur un côté, et un pointeur sur l'autre, par exemple(object.*ptr)()
.Envisager d'utiliser
function
etbind
(std::
ouboost::
, selon que vous écrivez en C++03 ou 0x) à la place de ceux-ci, cependant.Lorsque vous avez un pointeur normal (d'un objet ou d'un type de base), vous pouvez utiliser
*
de déréférencement d'elle:Sur le plan conceptuel, nous faisons la même chose avec un membre de pointeur de fonction:
Je l'espère, ce qui contribue à expliquer le concept. Nous sommes effectivement référence à notre pointeur à la fonction de membre. C'est un peu plus compliqué que ça-ce n'est pas un absolu pointeur vers une fonction dans la mémoire, mais juste un décalage, qui est appliqué à
foo
oup
ci-dessus. Mais sur le plan conceptuel, nous sommes de déférence, tout comme nous le ferions à déréférencer un objet normal pointeur.