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