Traduction de relation UML en C++

Traduction de relation UML en C++ - C++ - Programmation

Marsh Posté le 07-05-2008 à 10:01:20    

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  :)

Reply

Marsh Posté le 07-05-2008 à 10:01:20   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed