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 :

Wrapper/Container


Sujet :

C++

  1. #1
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut Wrapper/Container
    Hello,

    je cherche a avoir un peu d'eclaircissement sur ces 2 notions car c'est un peu flou ds ma tete pour le moment .

    Si qq'un peut m'apporter des precisions (a l'aide d'examples) ou m'orienter vers un lien qui pourrait m'etre utile je l'en remercie d'avance .

  2. #2
    R�dacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par d�faut
    Salut,

    - un wrapper, c'est une chose qui en enveloppe une autre pour que cette derni�re puisse �tre utilis�e dans un certain contexte.

    ex : une classe Entier, qui sert � stocker une valeur 'int' est un wrapper. �a "enveloppe" une variable de type int.

    - un container, �a sert � contenir (bon ok, bidon comme d�finition)

    ex : std::vector<int> contient des int.

    La diff�rence c'est qu'on container est fait pour contenir plusieurs variables d'un certain type qui seront utilis�es dans un prog comme �tant de ce type, alors qu'un wrapper permet d'envelopper une variable.

    Cela dit moi et les d�finitions claires on est pas toujours potes, alors une bonne alternatives c'est

    WRAPPER : programme � enveloppant � l'ex�cution d'un autre programme, pour lui pr�parer un environnement particulier. Utilis� par exemple pour s�curiser le fonctionnement de certaines applications en contr�lant tr�s pr�cis�ment leur interface avec le reste de l'univers connu.


    Enjoy yourself !

  3. #3
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut
    Merci,

    j'avais fait des recherches sur Google (pendant un peu pres 3h ) ., et ce que j'ai trouve etait soit assez vague , soit lie a un progamme monstrueux .

    J'ai donc essaye ici pour avoir une idee plus clair .

    Je vais prendre le contexte ds lequel je me trouve afin d'etre plus precis :

    J'ai une classe A et ses derivees A1,A2,...
    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
     
    class A
    {
        public:
        virtual double func(double x) const=0; //donc A est abstraite
        virtual A* clone() const=0;//pour cloner
        ...
    }
     
    class A1 : public A
    {
        ...
        virtual double func(double x); 
        virtual A* clone() 
        ...
    }
    ...
    Maintenant, disons que je veux garder dans une classe B un objet de type A . Pour ce faire je vais definir :
    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
     
    class Wrapper_A
    {
       private :
       A* myA
       public :
       ....//constructeur de recopie,destructeur,surdefinition de operator * pour
           //renvoyer myA
    }
     
    // ensuite je peux declarer B ainsi:
     
    class B
    {
        Wrapper_ A  Inner
        ....
    }
    La classe Wrapper_A que j'ai defini est bien un wrapper ? Quel est l'interet de la methode que j'ai utiliser ci dessus et y'a t'il d'autres applications ?

    Je suis pas sur d'avoir ete super clair mais si qq'un pense pouvoir m'aider thanks .

  4. #4
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut
    SVP qq'un peut il m'eclairer?

  5. #5
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Pourquoi tu mets pas directement un A dans ton B ?
    Pour moi ta classe Wrapper_A fait plutot office de proxy. G�n�ralement, un wrapper sert � utiliser un bout de soft d'un langage donn� dans un autre. Donc wrapper du C++ en C++, c'est un peu un non sens. Typiquement, une biblioth�que �crite en C aura son wrapper C++. Une traduction de wrapper que j'affectionne est surcouche. C'est pour �a que surcouche C++ � une biblioth�que C++ �a fait bizarre...
    Pour le container : http://c.developpez.com/faq/cpp/?page=STL#STL_container

  6. #6
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut
    En fait , je peux deja pas mettre un membre de type A dans B car ma classe A est abstraite, donc ca compilerai pas . Et puis je vais pas mettre une reference sur A (A&) car je veux que B contienne sa propre version de A et pas que ca depende de l'exterieur (donc pas de reference) .

    De plus B ne "doit pas savoir" de quel type est A , ca peut etre n'importe quel derives de A.

    Je vais donc mettre un pointeur sur A en tant que membre de B . (et l'initialiser ds le constucteur en clonant l'objet pris en argument , pour avoir ma propre version)

    Comme B contient un membre dynamique maintenant (A* MyAPtr) , je vais donc devoir definir un construteur de recopie, un destructeur, et une redefinition de l'operateur = .

    Mais si maintenant je sais que + tard je vais avoir a definir d'autres classes comportant un pointeur sur A . Je vais etre oblige a chaque fois de redefinir un operateur =, un constructeur de copie,....

    Je definis donc la classe Wrapper_A (defini + haut) qui contient un pointeur sur A et qui s'occupe de toutes ses taches .

    Et donc a chaque fois que j'ai besoin d'une classe avec un membre polymorhique de type A, je met a la place un membre Wrapper_A et j'ai + besoin de reecrire tt le temps un constructeur de recopie,etc...
    Je pourrais traiter Wrapper_A comme un objet normal

    Est ce que ca fait sens ou je me complique la vie pour rien?Je croyais que c'etait un procede plutot standard en language objet (qd on a en esprit de faire un code reutilisable)? Merci a celui qui pourra me donner un avis sur ce que je viens de decrire !

    Et c'est pourquoi je cherchais aussi a savoir si il y avait d'autres usages (interne au C++ et pas d'un language a un autre) pour les wrapper .

    NB : en fait ce que j'ai decrit ci dessus serait encore + utile si je faisais une class template wrapper selon le type de l'objet membre

  7. #7
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Ton id�e a du sens oui, cela s'appelle un pointeur intelligent. Il existe beaucoup de d�clinaisons des pointeurs intelligents, et effectivement mieux vaut les utiliser autant que possible, pour la raison que tu as cit�e et pour plein d'autres.

    La FAQ C++ en parle je crois, ainsi que pas mal de sujets sur ce forum, que tu pourras trouver avec la recherche avanc�e.

    Le must en mati�re de pointeur intelligent (au niveau r�utilisabilit� et flexibilit�) c'est un pointeur intelligent � base de polices comme ceux d�crits par Andrei Alexandrescu, et utilis�s dans la biblioth�que Loki.
    J'en parle �galement vite fait dans mes tutoriels.
    Ce genre de classe te permettrait d'obtenir ton Wrapper_A en r�ecrivant seulement ce qui est specifique � tes pointeurs (ie. l'appel � Clone() pour recopier le pointeur), sans recoder de A � Z les mecanismes des pointeurs intelligents.

    Je ne suis pas un pro de la terminologie, mais je pense que les pointeurs intelligents sont bien un exemple typique de wrappers ?

  8. #8
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Si j'ai bien compris tu veux pouvoir ajouter une s�mantique de valeur � un objet manipul� par pointeur (c'est � dire que la copie de pointeur implique un clonage).
    J'aurais plutot vu �a dans B::Clone() qui au passage fait un A::Clone() de ses A. Tu veux simplifier le boulot via une classe proxy si j'ai bien compris.
    C'est proche des smart pointers, sauf que au lieu de g�rer un partage de la m�me ressource toi tu veux dupliquer la ressource a chaque copie. Donc un template oui c'est mieux. Cela dit je me demande si c'est pas moyen de m�langer objets clonables et non clonables.

  9. #9
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut
    Merci bcp . J'avais un vague souvenir du nom Pointeurs intelligent (ou Smart Pointer) ss vraiment savoir ce que c'etait ; et tu as raison c'est effectivement ce que j'ai decrit (en regle general d'apres les recherches que je viens de faire) .

    Qd tu dis qu'il faut les utiliser le + souvent possible pour les raisons que j'ai cites et pour plein d'autres ; peux tu me donner une idee de ces autres raisons ?

  10. #10
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  11. #11
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut
    Desole j'avais pas encore vu le message d'Aurelien qd j'ai ecrit le precedent qui s'adressait a Loulou24 .
    Donc vis a vis du message d'Aurelien cette fois :

    En fait je n'ai pas de methode clone ds B . Je fais seulement appel a la methode clone de A ds le constructeur de B (qui prend en argument une reference sur un objet de type A .
    Donc je comprend pas tres bien ce que tu entends par melanger objet clonables et non clonables .

  12. #12
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Pour dupliquer des A tu utilises A::Clone().
    Pour dupliquer des B tu utilises le constructeur de recopie.
    B contient un A qu'il clone dans son constructeur de recopie (si j'ai bien compris).
    C'est �a que j'appelle m�langer. Je me demande si c'est pas moyen comme design, dans la mesure o� c'est h�t�rog�ne (un coup on manipule par pointeur, un coup par valeur).
    Note que les pointeurs intelligents ne font pas de Clone(). Si tu recopie un B qui a un pointeur intelligent sur a1, les 2 partageront le m�me a1...

  13. #13
    Membre habitu�
    Inscrit en
    Janvier 2005
    Messages
    13
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par d�faut
    Pour etre + precis , dans ma classe B (qui pourrait etre template selon A), il y aurait entre autre :
    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
     
    class B
    {  
       private :
         A* PtrA
     
       public :
       B(const A& inner) //CONSTRUCTEUR
       {  PtrA = inner.clone(); }
     
       B(const B& original) //CONSTRUCTEUR DE RECOPIE
       { if (original.PtrA != 0)
              PtrA = original.PtrA -> clone();
          else PtrA = 0;
       }
       ~B() // DESTRUCTEUR
       { if (PtrA != 0)
          delete PtrA;
       }
    ...
    ...
    }
    Donc B est responsable de l'objet pointe (vis a vis de la gestion memoire) et est detenteur de l'objet point� a tout moment.
    Si on copie B, l'objet pointe est aussi copi�, et donc tout objet B a sa propre copie de l'objet point� .

    Qu'est ce qui te convient pas trop ds ce code? Merci d'avance .

  14. #14
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Note que les pointeurs intelligents ne font pas de Clone(). Si tu recopie un B qui a un pointeur intelligent sur a1, les 2 partageront le m�me a1...
    "Pointeur intelligent" n'est qu'un concept, apr�s libre � nous (ou aux autres d'ailleurs) d'y mettre ce qu'il faut pour g�rer correctement le type de ressource concern�e, qui ne sera pas forc�ment un pointeur brut (comme dirait Luc, �a pourrait tr�s bien �tre des pots de peinture). Le comptage de r�f�rence n'est pas syst�matique non plus. Comme je l'expliquais plus haut, le mieux est sans doute une classe parametrable (via les templates), ainsi on n'a a r��crire que ce qui nous interesse.

    Qu'est ce qui te convient pas trop ds ce code? Merci d'avance
    Quelques broutilles : le test PtrA != 0 est inutile avant un delete, et il manque l'op�rateur d'affectation. A part �a, �a me parait "normal"
    B sera ta classe de pointeurs intelligents pour A ?

Discussions similaires

  1. Wrapper - Qu'est-ce donc ?
    Par Neitsa dans le forum C++
    R�ponses: 3
    Dernier message: 08/09/2004, 23h23
  2. Ajout d'un Component dans un Container
    Par willowII dans le forum Agents de placement/Fen�tres
    R�ponses: 6
    Dernier message: 07/09/2004, 18h08
  3. [LDAP] recherche dans differents container LDAP avec Java
    Par touinth dans le forum Autres SGBD
    R�ponses: 2
    Dernier message: 01/07/2004, 16h06
  4. [GEF]class Figure dans container SWING ?
    Par Albarad dans le forum Eclipse Java
    R�ponses: 2
    Dernier message: 01/06/2004, 12h12
  5. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres �diteurs
    R�ponses: 6
    Dernier message: 17/02/2003, 06h48

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