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 :

[POO] UML Association en C++ et les pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 23
    Par défaut [POO] UML Association en C++ et les pointeurs
    Bonjour,


    Quel est la meilleure façon d'avertir l'objet c2 de la disparition de c1 ?
    Ci-joint un exemple ?

    Merci

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    class C1
    {
      public:
        C1(void) : _objectNumber(_objectCount++) {}
        ~C1(void) { --_objectCount; }
      public:
        std::size_t objectNumber(void) { return _objectNumber; }
      private:
        static std::size_t _objectCount;
        std::size_t _objectNumber;
    };
     
    std::size_t C1::_objectCount = 0;
     
    class C2
    {
      public:
        C2(C1* c1) : _objectNumber(_objectCount++) { _c1 = c1; }
        ~C2(void) { --_objectCount; }
      public:
        std::size_t test(void) { return _c1->objectNumber(); }
        bool isValid(void) { return _c1!=NULL; }
      private:
        static std::size_t _objectCount;
        std::size_t _objectNumber;
        C1* _c1;
    };
     
    std::size_t C2::_objectCount = 0;
     
    int main(int argc, char* argv[], char* argenv[])
    {
      C1* c1 = new C1();
      C2 c2(c1);
      std::cout<<c2.isValid()<<std::endl;
      std::cout<<c2.test()<<std::endl;
      delete c1;
      c1 = NULL;
      std::cout<<c2.isValid()<<std::endl;
      std::cout<<c2.test()<<std::endl;
      return EXIT_SUCCESS;
    }
    Résultat :
    1
    0
    1
    0

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    je vais peut etre dire une anerie mais tu as regardé des pointeurs intelligents ?

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par hiko-seijuro Voir le message
    je vais peut etre dire une anerie mais tu as regardé des pointeurs intelligents ?
    Oui boost::shared_ptr stocke un compteur de référence.
    Un pattern observateur fera aussi l'affaire. La destruction d'un objet observé tient au courant une liste d'observateur...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 23
    Par défaut
    Effectivement il existe un bug car le constructeur par recopie n'est pas implémenté...

    J'aimerai trouver une façon de faire sans utiliser les shared_ptr ou les ????_ptr.

    Avez vous une implémentation C++ du pattern observateur ?

    thx

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oui j'imagine que tu voudrais réassigner des numéros pour chaque instance après destruction d'un objet pour pas avoir plusieurs fois le même numéro...

    Le pattern observateur sera je pense, très bon.
    http://come-david.developpez.com/tut...ge=Observateur

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Pour faire un pattern observateur, voir aussi boost::signal. C'est un peu plus sur qu'un vague code d'exemple bourré de pointeurs

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est pas simplement un weak_ptr que tu veux ?

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Attention ici tu n'as pas écrit de constructeur par recopie !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class C1
    {
      public:
        C1(void) : _objectNumber(_objectCount++) {}
        C1(const C1& c1)  { _objectNumber = _objectCount++ ;}
        ~C1(void) { --_objectCount; }
      public:
        std::size_t objectNumber(void) { return _objectNumber; }
      private:
        static std::size_t _objectCount;
        std::size_t _objectNumber;
    };

Discussions similaires

  1. [LG]Les pointeurs: Forme en "Anneaux"
    Par k o D dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2004, 07h29
  2. Réponses: 4
    Dernier message: 13/08/2004, 18h39
  3. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  4. pointeurs, toujours les pointeurs :/
    Par giviz dans le forum C
    Réponses: 16
    Dernier message: 08/10/2003, 15h02
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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