Polo37 | 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 :
- #include <set>
- class A;
- class B;
- class A : public Relation<A, B, set<B*> > {};
- class B : public Relation<B, A, set<A*> > {};
|
avec l'interface de Relation:
Code :
- template<typename classe, typename objet, typename conteneur>
- class Relation
- {
- private:
- conteneur _lstpObj;
- public:
- ~Relation();
- void add(objet* const obj);
- void remove(objet* const obj);
- };
|
et le tpp:
Code :
- template<typename classe, typename objet, typename conteneur>
- Relation<classe, objet, conteneur>::~Relation()
- {
- conteneur::iterator it = _lstpObj.begin();
- while (it != _lstpObj.end())
- {
- (*it)->remove(static_cast<classe*>(this));
- it = _lstpObj.begin();
- }
- }
- template<typename classe, typename objet, typename conteneur>
- void Relation<classe, objet, conteneur>::add(objet* const obj)
- {
- cout << "appel de la methode add Relation<classe, objet, conteneur>" << endl;
- if (_lstpObj.insert(obj).second)
- obj->add(static_cast<classe*>(this));
- }
- template<typename classe, typename objet, typename conteneur>
- void Relation<classe, objet, conteneur>::remove(objet* const obj)
- {
- if (_lstpObj.erase(obj) != 0)
- obj->remove(static_cast<classe*>(this));
- }
|
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 :
- class A : public Relation<A, B, set<B*> > {};
- class B : public Relation<B, A, set<A*> > , public Relation<B, C, set<C*> > {};
- class C : public Relation<C, B, set<B*> > {};
|
Là le compilateur me jete lorsque j'essaie de faire
Code :
- B* b = new B();
- A* a = new A();
- a->add(b);
- b->add(a); //ici erreur de compilation
|
Il me met:
Code :
- error C2385: accès ambigu de 'add' dans 'B'
- est peut-être le 'add' en base 'Relation<B,A,A *>::add'
- 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 |