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 :

Restreindre la création d'instance d'un classe


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 3
    Par défaut Restreindre la création d'instance d'un classe
    Salut,
    Voici mon probleme, je voudrais pouvoir créer des instance d'une classe A uniquement à partir d'une seconde classe B.
    Je pensais déclarer le constructeur de A privé et amie de la classe B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class B {
    public:
        NewA() {//Instancier un A}
    };
     
    class A {
    private:
       friend B::A(); //Constructeur de A amie de B ??
    };
    Peut on procéder ainsi ? Si oui est ce une bonne méthode ? Il y a t'il d'autre facon de procéder ?
    D'avance merci .

  2. #2
    Membre émérite
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Par défaut
    Salut,

    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A {}
    class B
    {
       friend class A;
       private B();
    }
    quoique conceptuellement je ne sais pas ce que ca vaux

    @++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 73
    Par défaut
    The Captain dans la proposition que tu fais en mettant le constructeur de B privé tu ne peux plus construire d'instance de B or ce n'est pas ca qui est voulu je pense.
    Moi je proposerai de creer ta classe A uniquement dans le .cpp et de créer l'instance que dans le constructeur de B. Après ca dépend si tu veux utiliser ta classe A en dehors de B c'est pas la bonne solution.

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Dans quel contexte as-tu besoin de cela?

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 3
    Par défaut
    umm je me suis peut etre mal expliqué...
    En fait je voudrai que B soit une sorte de "gestionaire d'objet de type A" ou B gère la création et la supression des objets A.
    soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A objet;           //On ne dois pas pouvoir créer de A ainsi
    A* ptr = B.NewA()  //mais uniquement par l'intermédiare de B
    ptr->FaireDesSuperTrucs();
    B.DeleteA(ptr);
    Ainsi je pourrais connaitre a tout moment le nombre d'objet A créé , interdire la création de nouvau A lorsque la zone mémoire aloué au objet de ce type sera pleinne, ect ...

  6. #6
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    un truc comme ça ?

    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
     
     
    class B {
      public :
        B();
        ~B();
      protected :
        class A; // Je dis ici qu'une class A existe et qu'elle est protegée dans B
        std::vector<A> _listDeA; // Je definie ici une liste d'objet A
    };
     
    // Je définie enfin la class A, declarée dans B
    class B::A {
      public :
        A() { } ;
        ~A() { } ;
    };

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 3
    Par défaut
    Citation Envoyé par superspag
    un truc comme ça ?

    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
     
     
    class B {
      public :
        B();
        ~B();
      protected :
        class A; // Je dis ici qu'une class A existe et qu'elle est protegée dans B
        std::vector<A> _listDeA; // Je definie ici une liste d'objet A
    };
     
    // Je définie enfin la class A, declarée dans B
    class B::A {
      public :
        A() { } ;
        ~A() { } ;
    };
    oui mais dans ce cas la classe A n'existera que dans B ? non ?

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Une fonction statique dans A ne conviendrait pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    A *ptr = A::New();
    if ( ptr )
    {
        ptr->FaireDesSuperTrucs(); 
        delete ptr; // ou A::Delete( ptr )
    }
    A::New peut en interne confier sa gestion à une autre classe B.

    C'est un design discutable aussi.

  9. #9
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    oui mais dans ce cas la classe A n'existera que dans B ? non ?
    Tout à fait mais ça n'est pas ce que tu voulais ?
    De cette manière la class A n'existe pas pour l'utilisateur, c'est entierement la class B qui gere A.
    Si l'utilisateur de B veux ajouter/recuperer/modifier tel ou tel chose sur un A, il faut ajouter des fonctionalitées dans la class B... Cette class fait donc office d'interface ...

  10. #10
    Membre éprouvé Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Par défaut
    salut
    Une fonction statique dans A ne conviendrait pas ?
    +1
    avec une donnée membre sattic dans A pour compter les instance si besoin.

    Pour detruire un A je pense que si l'on veut controler la creation des instances, il peut etre judicieu de passer aussi par un fonction static pour controler leur destruction.

  11. #11
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Le comptage peut être effectué dans le constructeur + destructeur de A.
    L'avantage de passer par delete est qu'on peut utiliser directement des pointeurs intelligents.

  12. #12
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Pourquoi ne pas faire un simple Factory?
    Cela dit, il est vrai que la meilleure façon de s'y prendre dépend fortement du contexte, mais nous n'en connaissons pas grand chose.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 73
    Par défaut
    Il me semble que le pattern factory correspond à ton attente. Tu peux utiliser les smart pointer aussi.

Discussions similaires

  1. connaitre l'instance d'une classe
    Par Jahjouh dans le forum C++
    Réponses: 8
    Dernier message: 25/11/2005, 22h44
  2. Declaré en classe de base, instancié en sous classe
    Par jobigoud dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2005, 10h55
  3. création d'instance avec oradim
    Par PATMOR dans le forum Oracle
    Réponses: 3
    Dernier message: 21/02/2005, 14h29
  4. Réponses: 6
    Dernier message: 06/12/2004, 22h18
  5. [JDBC]Création d'instances de base de données
    Par romano21 dans le forum JDBC
    Réponses: 5
    Dernier message: 29/04/2004, 15h05

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