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 :

Composition exclusive ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Composition exclusive ?
    Bonjour,

    Dans mon programme j'ai une relation de composition entre 2 classes
    qui ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include"classB.h"
     
    class A
    {
       B *pB;
      etc ...
    };
    tout ce qu'il y a de plus classique mais, ce que je voudrais c'est que cette classe B ne puisse être accessible/instanciée QUE par la classe A et aucune autre (qui pourrait le faire via un include "classA.h").
    Est ce possible ou faut-il que je repense entièrement ces 2 classes ?

    Merci

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Il suffit de définir tous les membres de B privés, et de rendre la classe A amie de B.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class B
    {
       // Constructeur
       B();
       friend class A;
    };
     
    class A
    {
       B *pB;
       // etc...
    };

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais là, la classe A a également accès à des membres de B auxquels elle n'est pas forcément censée accéder...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Mais là, la classe A a également accès à des membres de B auxquels elle n'est pas forcément censée accéder...
    Oui, effectivement. En fait il faudrait déclarer le constructeur de la classe B comme fonction membre ami de la classe A, mais je crois pas que ce soit possible....

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Et essayant ceci ?
    Déclarer B à l'intérieur de A et un attribut de A de type B en privé:
    Essayé avec VC++

    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
     
    // Generic.h: interface for the CGeneric class.
    //
    //////////////////////////////////////////////////////////////////////
     
    #if !defined(AFX_GENERIC_H____INCLUDED_)
    #define AFX_GENERIC_H____INCLUDED_
     
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
     
    class CGeneric  
    {
    private:
    	class CGeneric2
    	{
    	};
    	static CGeneric2 generic2;
     
    public:
    	CGeneric();
    	virtual ~CGeneric();
     
    };
     
    #endif // !defined(AFX_GENERIC_H____INCLUDED_)

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Merci pour ton aide
    Je n'ai jamais déclarer une classe de cette façon mais je vais essayer.

    Mais j'aimerais savoir pourquoi la variable generic2 est déclarée en static ?
    Que se passe t-il si on la déclare normalement ?

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

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par tintin72
    Oui, effectivement. En fait il faudrait déclarer le constructeur de la classe B comme fonction membre ami de la classe A, mais je crois pas que ce soit possible....
    Sinon tu appliques une indirection supplémentaire : tu crées une classe BCreator par exemple, avec une méthode privée createB, et tu rends A ami de la classe BCreator (ou la fonction createB fonction membre amie de la classe A).

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

Discussions similaires

  1. Archive tar et exclusion de fichiers
    Par aliasjcdenton dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 18/08/2004, 03h09
  2. [DBDESIGNER] exclusion lors d'héritage
    Par startout dans le forum DBDesigner
    Réponses: 3
    Dernier message: 09/06/2004, 23h44
  3. clés composites
    Par Yuna dans le forum Administration
    Réponses: 12
    Dernier message: 08/01/2004, 09h14
  4. Ouverture de la BD en exclusive
    Par ZEUSGR dans le forum Access
    Réponses: 2
    Dernier message: 22/09/2003, 11h15
  5. [WSAD] Composition visuelle d'une applet
    Par schum11 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/04/2003, 16h19

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