286 votes

C++ : Pointeur vers membre de données de classe

Je suis tombé sur cet extrait de code étrange qui compile très bien :

Pourquoi C++ ont ce pointeur vers un membre de données non statique d’une classe ? Quelle est l’utilisation du pointeur this étrange dans le code réel ?

103voto

JMcF Points 631

C’est le plus simple exemple je peux penser qui transmet les rares cas où cette fonctionnalité est pertinente :

La chose à noter ici est le pointeur passé à count_fruit. Cela évite que vous ayez à écrire count_apples séparé et count_oranges fonctions.

66voto

Une autre application sont des listes intrusives. Le type d’élément peut dire la liste quels sont ses pointeurs suivant/précédent. Si la liste n’utilise pas de noms codés en dur mais peut toujours utiliser les pointeurs existants :

39voto

peterchen Points 21792

Vous pouvez accéder plus tard de ce membre, n’importe quelle instance :

Notez que vous avez besoin d’une instance de l’appeler, donc il ne fonctionne pas comme un délégué.
Elle est rarement utilisée, j’ai besoin il peut-être une ou deux fois dans toutes mes années.

Normalement à l’aide d’une interface (c'est-à-dire une classe pure de base en C++) est le meilleur choix de conception.

26voto

AHelps Points 1171

IBM a plus de documentation sur l'utilisation de ce. Brièvement, vous utilisez le pointeur d'un décalage dans la classe. Vous ne pouvez pas utiliser ces pointeurs en dehors de la classe, ils se réfèrent, donc:

  int Car::*pSpeed = &Car::speed;
  Car mycar;
  mycar.*pSpeed = 65;

Il semble un peu obscur, mais une application possible est si vous essayez d'écrire du code pour la désérialisation de données génériques dans beaucoup de différents types d'objets, et de votre code doit gérer les types d'objets qu'il ne connaît absolument rien au sujet (par exemple, votre code est dans une bibliothèque, et les objets qui vous désérialisez été créé par un utilisateur de votre bibliothèque). Le membre pointeurs de vous donner un générique, semi-lisible façon de se référer aux données individuelles des membres des compensations, sans avoir à recourir à sans type void * tours de la même façon que vous pouvez pour C des structures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X