IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème d'accés et classe interne.


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Problème d'accés et classe interne.
    Salut!

    Dans cette configuration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class A
    {
    	protected:int n;
    	friend class B;	
    };
     
    class B{
    public:A* p_a1;
     
    public:class C{
    	public:A* p_a2;
     
    	public:void f2(){
    		   cout<<p_a2->n<<endl;
    		   }
     
    	};
     
    public:void f1(){
    		   cout<<p_a1->n<<endl;
    	   }
     
    };
    "f2()" ne peut pas accéder à "A.n" car il est "protected".
    Comment déclarer "C" en tant que classe "friend" de "A" afin d'y avoir accés comme le fait "f1()" car "B" est "friend" de "A"?

    Merci de votre aide.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Salut,

    Dans ta classe A il suffit de rajouter la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    friend class B::C;

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de la réponse mais ce n'est pas possible dans cette configuration car "B" n'est pas défini et donc l'accés à ses membres est impossible; ce que confirme le compilo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2027: use of undefined type 'B'
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Et si tu déclares B avant A, avec simplement une déclaration anticipée de A avant la déclaration de B (ce qui doit être possible puisque tu n'utilises que des pointeurs sur A) ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class A;
     
    class B{
    public:A* p_a1;
     
    public:class C{
    	public:A* p_a2;
     
    	public:void f2(){
    		   cout<<p_a2->n<<endl;
    		   }
     
    	};
     
    public:void f1(){
    		   cout<<p_a1->n<<endl;
    	   }
     
    };
     
    class A
    {
    	protected:int n;
    	friend class B;
    	friend class B::C;
    };

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Eusebe
    Et si tu déclares B avant A, avec simplement une déclaration anticipée de A avant la déclaration de B (ce qui doit être possible puisque tu n'utilises que des pointeurs sur A) ?
    Merci mais:
    -Inverser l'ordre des classes risque de perturber d'autres classes qui les utilisent;
    -"A" est utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cout<<p_a2->n<<endl;
    cout<<p_a1->n<<endl;
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par seriousme
    Merci mais:
    -Inverser l'ordre des classes risque de perturber d'autres classes qui les utilisent;
    Ah bon, comment ? Tu aurais un exemple ?

    Citation Envoyé par seriousme
    -"A" est utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cout<<p_a2->n<<endl;
    cout<<p_a1->n<<endl;
    Ah oui, j'avais pas vu... Mais pour passer outre, il suffit de séparer déclaration et implémentation.
    Si tu veux des fonctions inline, tu peux utiliser le mot clé "inline". Ce qui donnerait quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    class A;
     
    class B{
    public:A* p_a1;
     
    public:class C{
    	public:A* p_a2;
     
    	public:void f2();
     
    	};
     
    public:void f1();
     
    };
     
    class A
    {
    	protected:int n;
    	friend class B;
    	friend class B::C;
    };
     
    inline void B::C::f2(){
    	cout<<p_a2->n<<endl;
    	}
     
    inline void B::f1(){
    	cout<<p_a1->n<<endl;
    	}

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ca fait un peu fouilli mais ça compile.
    Merci.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par seriousme
    Ca fait un peu fouilli mais ça compile.
    Merci.
    Et bien en fait si tu sépares déclaration, implémentation et classes, ça fera moins fouilli . Tu te retrouveras juste avec les fichiers cpp et h des classes A et B (soit 4 fichiers).

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Eusebe
    Et bien en fait si tu sépares déclaration, implémentation et classes, ça fera moins fouilli . Tu te retrouveras juste avec les fichiers cpp et h des classes A et B (soit 4 fichiers).
    OK, c'est noté, merci.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'accès à la classe ZipFile
    Par gilles99 dans le forum Framework .NET
    Réponses: 5
    Dernier message: 25/04/2014, 15h17
  2. Problème avec classLoader et classe interne
    Par croquette06 dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2012, 00h01
  3. Problème d'accès aux méthodes d'une classe
    Par RR instinct dans le forum Langage
    Réponses: 5
    Dernier message: 26/06/2006, 14h51
  4. Réponses: 16
    Dernier message: 07/02/2006, 14h19
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo