2009-04-08 7 views
4

Est-il possible d'accéder aux membres privés d'une classe en C++.Est-il possible d'accéder aux membres privés d'un cours?

à condition que vous ne disposez pas d'une fonction ami et vous n'avez pas accès à la définition de classe

+0

pourquoi ne serait-il possible? –

+0

juste une question d'entrevue ... en fait, je suis d'accord avec aucun sens à faire cela – yesraaj

+0

@litb s'il vous plaît alors ajouter la solution – yesraaj

Répondre

8

Vous voulez dire en utilisant un peu d'arithmétique de pointeur pour obtenir l'accès? C'est possible mais c'est définitivement dangereux. Jetez aussi un oeil à cette question: Accessing private members

+1

cette réponse sur l'autre question a été acceptée, mais c'est incorrect. ce n'est pas possible, mais si ça marche, c'est par pur accident: un comportement indéfini est arrivé. –

+0

Oui, modifiez le lien afin qu'il pointe vers la réponse "correcte". – Naveen

+0

oh, gentil :) btw je me suis souvenu à tort de cette réponse acceptée. ça n'a pas l'air trop mal imho. mais le maintenant lié à la réponse est mieux imho. acclamations –

2

Eh bien, je pourrais parler de rubish, mais je pense que vous pourriez essayer de définir une classe "twin" avec les mêmes membres que la classe que vous voulez modifier, mais différents modificateurs public/privé et puis utilisez reintepret_cast pour lancer la classe d'origine dans la vôtre dans laquelle vous pouvez accéder aux membres privés.

Son un peu hacky ;-)

Un peu de code pour expliquer l'idée:

class ClassWithNoAccess 
{ 
public: 
    someMethod(); 

private: 
    int someVar; 
}; 

class ClassTwin 
{ 
public: 
    someMethod(); 

public: 
    int someVar; 
} 

et quelque part dans le code:

ClassWithNoAccess* noAccess = new ClassWithNoAccess(); 
ClassTwin* twin = reinterpret_cast<ClassTwin *>(noAccess); 
twin->someVar = 1; 

edit: si quelqu'un comme déjà écrit avant, cela pourrait fonctionner mais la norme ne garantit pas l'ordre des variables avec modificateur public et privé sera le même

+0

Vous devez être prudent si vous avez l'intention de passer par là. Changer vos méthodes privées à publiques peut transformer une classe régulière en un agrégat ou un POD, en changeant efficacement la façon dont le compilateur gère cela. –

6

Je pense qu'il y avait un vieux truc de l'école comme ceci:

#define private public 
#include "header.h" 
#define private private 

Mais vous êtes fortement déconseillé de le faire (je l'ai lu rapidement que quelque chose dit à ce sujet dans la norme C++) - si vous voulez En savoir plus sur ce google pour "#define private public"

+0

Yuck mec c'est juste méchant! – xtofl

+0

Je n'ai pas défini de classe dans deux fichiers d'en-tête. Est-il possible de déclarer les membres publics dans un fichier et privé dans un autre et ne livrer que l'en-tête public? Si c'est le cas, nous n'avons absolument aucune idée de ce qu'il y a d'autre dans la classe. – Les

+0

Vous pourriez utiliser quelque chose comme l'idiome PIMPL http://www.gotw.ca/gotw/024.htm pour cacher les parties intimes – bernhardrusch

2

Même si cela était possible grâce à un hack méchant - voir les messages précédents - vous ne devriez pas le faire .

L'encapsulation existe dans un très bon but, et le fait de définir un membre de classe comme étant privé signifie que le développeur n'a pas l'intention de faire des bêtises avec ce membre. Cela devrait signifier

« Vous ne devez pas accéder à ce membre pour pouvoir utiliser l'interface publique à sa mesure prévue complète »

Questions connexes