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

  FORUM HardWare.fr
  Programmation
  C++

  Solution à un problème de design

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Solution à un problème de design

n°1559530
Bi$cotte
:o
Posté le 13-05-2007 à 09:23:15  profilanswer
 

Salut les progueux  :hello:

 

Bon je m'excuse d'avance si ca a déja été traité / trivial mais j'avoue que j'ai pas trouvé de terme pertinent pour lancer une recherche  :o

 

Voilà mon problème : j'ai une hiérarchie simplissime de trois classes. Une classe de base (A) et deux classes qui en héritent (B et C). Sur A j'ai une méthode (virtuelle pure) protected qui fait office de fonction utilitaire puisque j'aimerai que les classes dérivées puissent s'en servir mais pas l'exterieur. Cette méthode me permet d'accéder à des infos internes à la classe qui l'implémente (retourne une instance de class infos).

 

J'ai donc logiquement un truc comme ça :

Code :
  1. class A {
  2. public:
  3.   A();
  4.   virtual ~A();
  5.   virtual bool link(A *peer) = 0;
  6. protected:
  7.   virtual infos *helper() = 0;
  8. };
  9. class B : public A{
  10. public:
  11.   B();
  12.   virtual ~B();
  13.   virtual bool link(A *peer);
  14. protected:
  15.   virtual infos *helper();
  16. };
  17. class C : public A {
  18. public:
  19.   C();
  20.   virtual ~C();
  21.   virtual bool link(A *peer);
  22. protected:
  23.   virtual infos *helper();
  24. };


Mon souci c'est que j'aimerai faire quelque chose comme ça:

Code :
  1. bool B::link(A *peer) {
  2.   infos *infos_peer = peer->helper();
  3.   infos *infos_self = helper();
  4.   // traitement en fonction de ces infos
  5.   ...
  6. }


Mais c'est pas possible, A::helper() est protected dans ce contexte :(
Alors à part passer la fonction helper() en public (ce qui ne me plaît pas du tout) est ce qu'il existe une solution à ce problème ? Ou est ce que c'est un problème de design plus général ?


Message édité par Bi$cotte le 13-05-2007 à 14:36:14
mood
Publicité
Posté le 13-05-2007 à 09:23:15  profilanswer
 

n°1559541
Amonchakai
Posté le 13-05-2007 à 11:11:37  profilanswer
 

Salut !
Heu, tu n'aurrai pas tout simplement oublié de faire hériter B et C de la classe A ? Et puis la je vois pas pourquoi ça ne marcherai pas...

n°1559542
_darkalt3_
Proctopathe
Posté le 13-05-2007 à 11:16:29  profilanswer
 

Euh oui, dans le code, où est la relation d'héritage ? (antidtc bouclar activated)


---------------
Töp of the plöp
n°1559543
_darkalt3_
Proctopathe
Posté le 13-05-2007 à 11:17:21  profilanswer
 

et sinon friend ...


---------------
Töp of the plöp
n°1559586
Bi$cotte
:o
Posté le 13-05-2007 à 14:23:42  profilanswer
 

Oui merde daysolay  pour le public A, c'est une typo :o
Par friend t'entend déclarer B et C comme friend de A ?
C'est pas génial pour le jour ou je fais dériver une autre classe de A ... mais c'est moins pourri que le public.
C'est chiant un peu comme problème :o

n°1559587
Amonchakai
Posté le 13-05-2007 à 14:29:56  profilanswer
 

Je pense que tu dois pas bien saisir...
Tu dit que B et C héritent de A alors que dans le code que tu donne tu ne fait aucun héritage... Donc c'est normal que ça marche pas.
Et puis en ce qui conserne le friend c'est bien sur ta fonction helper qui doit être friend (mais c'est pour faire une alternative a l'héritage vu que tu en fasait pas...) Mais j'ai lut que c'étais a éviter le plus possible... (mais c'est une solution)

n°1559588
Bi$cotte
:o
Posté le 13-05-2007 à 14:35:49  profilanswer
 

Oui, c'est moi qui ai fait une erreur dans le code que j'ai mis dans le premier post, j'ai oublié le public A. B et C héritent bien de A. (j'édite le post être tranquille).
L'ennui c'est que ma fonction helper() elle est virtuelle. En la sortant de la classe Je peux toujours la faire appeller une fonction virtuelle protected déclarée dans A et redéfinie par B et C mais c'est assez bordélique je trouve.
Je pensais qu'il y avait une autre solution que passer par du friend ou du public, mais c'est vrai que c'est pas evident.

 

Ca pete l'encapsulation :o pis mes evil users ils peuvent toujours appeler ma fonction friend et foutre leur merde :o

 

Heu sinon Amonchakai, je t'assure qu'appeler une méthode protected sur un objet autre que this (quand on est pas dans la classe de base) ben ca passe pas.


Message édité par Bi$cotte le 13-05-2007 à 14:42:57
n°1559589
Amonchakai
Posté le 13-05-2007 à 14:49:09  profilanswer
 

ha bah c'est moi qui comprends pas tu veux héviter l'héritage public, c'est ça ?
Mais je pense pas que ça soit crade de le faire...
[edit] ha ça y est je viens de voir :D j'avais pas vu que tu appellais la méthode helper() d'une instance de A dans ta méthode link de la classe B...  
Donc oui, a priori je serai tenté de dire qu'il faudrai passer ta méthode helper en public...
 
désolé :D


Message édité par Amonchakai le 13-05-2007 à 14:54:02
n°1559665
++fab
victime du syndrome IH
Posté le 13-05-2007 à 18:42:44  profilanswer
 

Comme le contrôle d'accès s'effectue "par classe" (et non par objet), en C++, tu peux/dois appeler helper depuis une fonction membre de la classe A. Une solution consiste à faire en sorte que link soit une fonction publique non virtuelle qui effectue des pré-post traitement avant l'appel à une fonction membre protégée -ou private- virtuelle -pure ou non- doLink. Cette fonction doLink peut-être customisée dans les classes plus dérivées. C'est le pattern (mal) nommé "template méthode".  
 
Il y a un intérêt à rendre doLink protégé si on en fourni une implémentation dans la classe de base. Cette implémentation par défaut peut être appelé depuis une fonction doLink d'une classe plus dérivée.
 
Peut-être que cette technique peut fonctionner pour ce que tu essayes de faire.


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

  Solution à un problème de design

 

Sujets relatifs
probleme sur scilabprobléme frame , include
Probleme Application.OnMessageProblème : Requêtes sans résultat
Problème select[PHP-GTK] Mais où est le problème ?
Problème d'encodageProblème avec bouton on/off
[Perl - Débutant]Probleme de comparaison de 2 chainesproblème avec des méthodes inline
Plus de sujets relatifs à : Solution à un problème de design


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR