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 :

Problemes avec implementation de decorateurs


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm� Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par d�faut Problemes avec implementation de decorateurs
    Salut les gars,

    J'ai quelques soucis pour implementer des decorateurs dans un projet C++.

    J'ai voulu prendre comme modele celui qui se trouve dans la section design patterns de developpez.com.

    En fait mon souci c'est que je peux creer mondecorateur a partir de une classe de base grace a un new, mais lors de l'appel des fonctions specifiques de chaque decorateur je trouve une erreur de compilation... la classe apres application du decorateur est toujours considere comme classe de base (DestructibleElement).

    Le code ou je me sers des decorateurs est le suivant:

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
     
    #include "DecoratorWarElement.h"
    #include "DecoratorArcher.h"
    #include "DecoratorColor.h"
     
    time_t aStart, aEnd; ///@@@ time performance
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    	srand (time(NULL));
     
    /*
        BaseAliment *c=new Aliment(1.5,"Gauffre");
        cout<< (*c)<<endl;
        c=new DecorateurGout(*c,0.2,"Sucre");
        cout<<*c<<endl;
        c=new DecorateurGout(*c,0.3,"Nutella");
        cout<<*c<<endl;
    */
     
     
    	std::cout<<"Hello World !!"<<std::endl;
     
    	DestructibleElement * aDestructibleElement1 = new DestructibleElement(100); // Points of life 100 
     
    	aDestructibleElement1 = new DecoratorWarElement(*aDestructibleElement1,200, 60); //Points of life upgrade 200 / Power 60
     
    	std::cout<<"Points of life of Element1 before first attack -> " <<aDestructibleElement1->getPointsOfLife()<<std::endl;
    	std::cout<<"Power of Element1 before first attack -> " <<aDestructibleElement1->getPower()<<std::endl;
     
    	aDestructibleElement1 = new DecoratorColor(*aDestructibleElement1, "Pink");
    //	std::cout<<"Color of Element1 before first attack -> " <<aDestructibleElement1->getColor()<<std::endl;
    	std::cout<<"Points of life of colored Element1 before first attack -> " <<aDestructibleElement1->getPointsOfLife()<<std::endl;
     
    /*
    	aDestructibleElement2 = new DecoratorArcher(*aDestructibleElement2, 200, 60); //Points of life 200 / Power 60
     
    	//Shows aDestructibleElement2 points of life
    	std::cout<< "Points of life of Element2 before first attack -> "<<aDestructibleElement2->getPointsOfLife()<<std::endl;
     
    	//aDestructibleElement1 attacks aDestructibleElement2
    	aDestructibleElement1->attack(aDestructibleElement2);	
    	std::cout<< "Points of life of Element2 after first attack -> "<<aDestructibleElement2->getPointsOfLife()<<std::endl;
    */	
    	//freeing the allocated memory
    	delete aDestructibleElement1;
    //	delete aDestructibleElement2;
     
     
      return EXIT_SUCCESS;
    }
    Pouvez vous m'eclaircir un peu svp ?

    Je mets en piece jointe les fichiers de l'implementation des decorateurs.

    Merci bcp !

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    Salut,

    Citation Envoy� par donkeyquote Voir le message
    En fait mon souci c'est que je peux creer mondecorateur a partir de une classe de base grace a un new, mais lors de l'appel des fonctions specifiques de chaque decorateur je trouve une erreur de compilation... la classe apres application du decorateur est toujours considere comme classe de base (DestructibleElement).
    Tes explications sont loin d'�tre claires...
    Essaye de dire tr�s exactement quelle ligne de code produit quelle erreur de compilation peut-�tre ?
    (mets un code minimal aussi parce qu'avoir toutes ces lignes en commentaires et ce rar avec tous ces fichiers dans plein de r�pertoires n'aident pas beaucoup)

    Bon j'ai quand m�me r�ussi � voir que y'a une fuite m�moire puisque le d�corateur devient visiblement possesseur du d�cor� mais il ne le d�truit pas (oui j'ai t�l�charg� le rar et j'ai fini par trouver le bon fichier).

    MAT.

  3. #3
    Membre confirm� Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par d�faut
    Desole si je n'ai pas ete assez explicite ...
    En fait dans les fichiers que je vous ai joints il y a 4 parties :

    1) Un "element" qui s'appele "Destructible Element" et qui se trouve dans la premiere couche du repertoire Element (include pour les .h et src pour les .cpp). C'est l'element de base qui va etre "decore par les decorateurs". Dans un premier moment je l'avais declare classe virtuelle pure, mais je me suis rendu compte que cela n'etait pas vraiement possible (ou je ne sais pas trop comment faire, peut-etre passer par une classe intermediaire, mais a quoi les decorateurs serviraient alors ?) si en suite je voulais faire une instanciation de cette objet afin de le decorer...

    2) Un repertoire avec des decorateurs (Decorator) DecoratorWarElement, DecoratorArcher, DecoratorColor (celui-ci est un dummy). C'est le DecoratorWar que j'ai utilise pour faire mes premiers tests... (qui ne marchent pas )

    3)Une factory qui prends en chage la creation des elements... elle n'est pas vraiment au point car je l'ai repris d'une ancienne version qui n'outilise pas de decorateurs... donc des idees d'adaptation a mon cas sont les bien venues

    4)Dans le repertoire "test" a l'interieur du repertoire Decorator il y a le code qui fait les test des decorateurs (celui qui donne l'erreur de compilation).

    Le but de mes decorateur est de faire en sorte de rajouter de surcouches a l'element de base afin de pouvoir creer des elements de propietes composees... par example avec un decorateur canon, WarElement et un autre tour, pouvoir reusir a avoir une tour-canon a partir d'un element de base "DestructibleElement"

    L'erreur que je trouve est el suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    src/TestDecorator.cpp:46: error: ‘class DestructibleElement’ has no member named ‘getPower’
    Dans le cas de l'appel de GetPointsofLife il n'y a pas de souci car la methode est virtuelle existant dans la classe de base ... mais je pense que le but du decorateur est de faire independant les methodes du decorateurs de celles declarees dans la methode de base, je me trompe ?

    Je ne sais pas si j'ai ete suffissament explicite cette fois-ci, n'hesitez pas a me demander plus d'explications car la resolution de ce cas serait vraiment interessant pour moi d'un point de vue pedagogique.

    Merci encore.

  4. #4
    Membre �clair�
    Inscrit en
    Mai 2005
    Messages
    73
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par d�faut
    Je pense que tu as mal compris le polymorphisme : en utilisant l'h�ritage, tu permets de sp�cifier que DestructibleElement et DecoratorWarElement peuvent �tre trait�s de la m�me fa�on (par exemple en appelant la m�thode getPointsOfLife).
    Mais si tu veux utiliser des fonctions propres � ton DecoratorWarElement (autrement dit, des m�thodes propres au type r�el de l'instance et non � son type d�clar�), il faut alors pr�ciser au compilateur que l'objet sera de type DecoratorWarElement, soit au moment de la d�claration, soit avec un dynamic_cast (sachant que cette derni�re option cache tr�s souvent des erreurs de conception, tu pourras en savoir plus en effectuant une rechercher sur le forum ou dans la FAQ).
    En clair, pour conna�tre le type d'un objet, le compilateur ne dispose que de sa d�claration, et pas de son instanciation, qui ne s'effectuera qu'au runtime. Il ne sait donc pas que aDestructibleElement1 sera de type DecoratorWarElement.

  5. #5
    Membre confirm� Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par d�faut
    Alors... ca me trouble un peu car je vois pas la difference entre mon code par rapport a ce qu'on fait dans le tutoriel de design patterns de developpez.com :

    http://come-david.developpez.com/tut...ecorateur#LV-1

    Quelqu'un peut m'expliquer un peu ca ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    La diff�rence c'est que dans le tutoriel GetLimite n'est jamais utilis�.
    Pas g�nial ce tutoriel d'ailleurs...

    MAT.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    R�ponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum R�seau
    R�ponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    R�ponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    R�ponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    R�ponses: 4
    Dernier message: 08/06/2002, 23h06

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