Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3860 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Traduction de relation UML en C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Traduction de relation UML en C++

n°1729353
Polo37
Posté le 07-05-2008 à 10:01:20  profilanswer
 

Bonjour à tous,
 
Je voudrais traduire les relations UML en C++ de sorte à gérer les relations 1-1, 1-n et n-n le tout en assurant l'intégrité des relations (par exemple si un objet est détruit, il doit détruire les relations qui le lient à d'autre objets). Voici comment je pensais procéder:
Si on considère deux classes A et B avec une relation n-n gérée en interne par un set

Code :
  1. #include <set>
  2. class A;
  3. class B;
  4. class A : public Relation<A, B, set<B*> > {};
  5. class B : public Relation<B, A, set<A*> >  {};


avec l'interface de Relation:

Code :
  1. template<typename classe, typename objet, typename conteneur>
  2. class Relation
  3. {
  4. private:
  5. conteneur _lstpObj;
  6. public:
  7. ~Relation();
  8. void add(objet* const obj);
  9. void remove(objet* const obj);
  10. };


et le tpp:

Code :
  1. template<typename classe, typename objet, typename conteneur>
  2. Relation<classe, objet, conteneur>::~Relation()
  3. {
  4. conteneur::iterator it = _lstpObj.begin();
  5. while (it != _lstpObj.end())
  6. {
  7.  (*it)->remove(static_cast<classe*>(this));
  8.  it = _lstpObj.begin();
  9. }
  10. }
  11. template<typename classe, typename objet, typename conteneur>
  12. void Relation<classe, objet, conteneur>::add(objet* const obj)
  13. {
  14. cout << "appel de la methode add Relation<classe, objet, conteneur>" << endl;
  15. if (_lstpObj.insert(obj).second)
  16.  obj->add(static_cast<classe*>(this));
  17. }
  18. template<typename classe, typename objet, typename conteneur>
  19. void Relation<classe, objet, conteneur>::remove(objet* const obj)
  20. {
  21. if (_lstpObj.erase(obj) != 0)
  22.  obj->remove(static_cast<classe*>(this));
  23. }


Jusque là tout va bien, le seul problème c'est quand je cherche à avoir plusieurs relations au sein d'une classe: par exemple A,B, et C avec une relation n-n entre A et B et n-n entre B et C.

Code :
  1. class A : public Relation<A, B, set<B*> > {};
  2. class B : public Relation<B, A, set<A*> > , public Relation<B, C, set<C*> > {};
  3. class C : public Relation<C, B, set<B*> >  {};


Là le compilateur me jete lorsque j'essaie de faire

Code :
  1. B* b = new B();
  2. A* a = new A();
  3. a->add(b);
  4. b->add(a); //ici erreur de compilation


Il me met:

Code :
  1. error C2385: accès ambigu de 'add' dans 'B'
  2.         est peut-être le 'add' en base 'Relation<B,A,A *>::add'
  3.         ou le 'add' en base 'Relation<B,C,C *>::add'


(je précise que j'utilise visual 2003) ce que je ne comprends pas puisque le paramètre de add est 'a' qui est de type A*, il devrait donc pouvoir s'en sortir entre le add de 'Relation<B,A,A *> (void add(A* const obj)) et celui de 'Relation<B,C,C *> (void add(C* const obj)). Dans tout les cas, je ne sais pas si c'est une bonne approche, elle a l'avantage de se reposer sur une seule classe que je pourrais tester une fois pour toute. Comment vous procedez vous pour coder les relations n-n en C++? Merci de m'avoir lu, je suis ouvert à toute proposition de modélisation, partagez moi votre expérience  :)

mood
Publicité
Posté le 07-05-2008 à 10:01:20  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Traduction de relation UML en C++

 

Sujets relatifs
[C#] Afficher un texte pendant qu'un bouton est appuyé[C# - Nunit]
[C] Borlad 5.02 + Beck DK51traiter un .csv en C++
[C++] Variables globales non initialisées ?Générer des mail sous borland C++
Pile rapide en C++créer un echiquier en C
[PIC] Problème de mise en place I²C[C] lire un fichier......mon dieu aidez moi !!
Plus de sujets relatifs à : Traduction de relation UML en C++


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)