Je veux accéder à un membre de données privé dans une classe. Il n'y a pas de fonction de membre dans la classe pour accéder au membre de données privé. C'est privé. p>
Je veux prendre la classe et certains à quel point il est ouvert. Une méthode consistait à copier la déclaration de la classe, à rendre le membre privé public et à appeler la nouvelle classe de classe quelque chose_else. Ensuite, je fais une réinterprétation et copiez l'objet d'origine. Cela marche. Mais je veux quelque chose de plus élégant ... ou peut-être générique ... ou juste d'une autre manière. P>
Quelles options y a-t-il? Puis-je utiliser Void *? Puis-je mémoriser la classe dans une autre classe vide? Que sont les moyens de faire cela ?? p>
% p>
6 Réponses :
Je suppose que p>
Il y a quelques façons de subverser l'accès aux membres privés d'une classe, comme démontré dans gotw # 76 . P>
ami code> DÉCLARATION. LI>
- Utilisez Evil Macros:
#define Private Public Code> Avant d'inclure la classe 'Header EM>. Li>.
- Écrivez une définition de classe avec une mise en page binaire identique et utilisez
Reterpret_cast CODE> pour passer de la classe d'origine à un faux. Li>
- Spécialisez une fonction de membre de modèle s'il y en a une (la seule solution portable). LI>
ol>
Aimer les macros diaboliques mentionnent;)
Vous pouvez, mais vous ne devriez pas. Les objets ne sont que de la mémoire. Vous pouvez certainement lancer le pointeur en une classe équivalente qui a les mêmes membres, mais où tout est public. Mais pourquoi voulez-vous faire cela? Avez-vous le code de quelqu'un d'autre que vous devez travailler? Demandez-leur d'ajouter des méthodes appropriées d'accesseur. Avez-vous vraiment besoin de les traiter comme membres du public? Changer la classe. p>
Je ne suis pas vraiment sûr de ce que vous essayez de faire, mais c'est probablement une erreur. P>
Je suis d'accord avec le commentaire "Modifier la source", mais je pense que vous devriez ajouter une méthode, pas seulement commentez le "privé". P>
Vous devez avoir la déclaration de la classe, vous avez donc probablement l'en-tête mais éventuellement pas le fichier .CPP / quel que soit le fichier. Ajoutez une fonction de membre en ligne à la classe dans une copie de l'en-tête et incluez cet en-tête au lieu de l'original. Vous devriez toujours pouvoir créer un lien vers le fichier d'objet pour le code source inaccessible. P>
Bien sûr, cela compte comme un piratage diabolique, contournant les protections intégrées dans la langue plutôt que de travailler avec eux. C'est pourquoi je suggère le hack minimalement diabolique - ne faites pas tout de pair privé, et si vous pouvez vous échapper avec un getter (mais aucun seint) le faire. Bien sûr, le vrai mal minimal n'est pas de le faire, s'il y a du tout pour l'éviter. P>
N'oubliez pas que si c'est une classe d'Elesse, la prochaine version pourrait être mise en œuvre différemment et pourrait ne pas avoir ce membre du tout. P>
Avec l'idée que vous suggérez dans votre question, vous n'avez pas besoin de copier l'objet d'origine. Si vous écrivez votre propre variation «TOUT PUBLI» de la Déclaration de la classe réelle, lancez un pointeur sur ce nouveau type, vous pouvez accéder directement à l'objet à travers celui-ci. P>
La raison pour laquelle rien de tout cela n'est une bonne idée n'est simple. Vous devez manipuler des objets d'une classe dont vous ne contrôlez pas la source (sinon vous pourrez modifier la source pour vous donner l'accès dont vous avez besoin). Mais si vous ne contrôlez pas la source, alors si les responsables changent la mise en page de leur classe? Votre version dupliquée ne correspondra plus et il n'y aura aucun moyen pour le compilateur de détecter cette inadéquation. Le résultat sera probablement la corruption de la mémoire au moment de l'exécution. P>
Comme il est mal compris, je dois clarifier. Toutes les solutions suivantes #include <class_fixed.h>
ObjectFoo instance;
merci ... je voulais montrer le code de mon correctif d'origine. La raison en tant que quelqu'un a atteint, c'est que je ne peux pas changer le code d'origine ... Je dois donc faire une pause de prison.
Ceci fonctionne ... mais je pense que je veux quelque chose de plus générique ... ou plus flexible. p>
% p> p>
De nombreuses réponses ici ont supposé que vous ne pouvez pas modifier le code d'origine .cpp code>, pendant que vous pouvez modifier - ou simplement copier, renommer et réinclude - le fichier en-tête b>. Re-lisez les réponses avec cette idée.
Il est beaucoup préférable d'ajouter ces informations à la question initiale plutôt que de l'ajouter comme une réponse.
Que diriez-vous d'éditer la source?
// privé: code> fonctionnera très bien;)
Je pense qu'il veut conserver les utilisateurs de sa classe de jouer autour (donc le privé) et doit mettre en œuvre quelque chose qui ne correspond pas vraiment à la conception actuelle.
Je pense que vous n'avez pas le code, n'est-ce pas?
@Liranuna: Commenter le «Private: 'Tag fonctionnera dans certaines situations, mais peut subtilement casser du code dans d'autres. Vous pouvez modifier subtilement un type non de pod en une pod et la langue a des règles légèrement différentes pour ces types.
Je pense que nous devrons savoir pourquoi i> vous voulez cela. La réponse dépend beaucoup de ce que vous essayez d'atteindre.