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

Langage C++ Discussion :

Individualiser le comportement d'un objet


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 17
    Par défaut Individualiser le comportement d'un objet
    Bonjour,

    Voila j'ai une classe de base qui est capable de faire des traitements, et j'aimerai pouvoir ajouter a cette classe des comportements via d'autre classes bien definies (que j'appelle des tags, ou etiquette). Voici comment j'envisage la chose :
    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
     
    // une classe de base
    class Base
    {
       std::vector<Tag> myTags;   ///< Les options
    public:
       void addTag(const Tag& tag); ///< Ajout d'une option
       void execute();  ///< Ici on itere sur les tags et appelle Tag::onExecute(this)
    };
    // la classe de base qui va modifier le comportement de Base
    class Tag
    {
    public:
       virtual void onExecute(Base* b) = 0; 
    };
    // une classe derivee
    class Print : public Tag
    {
    public:
    void onExecute(Base* b); ///< Comportement defini, qui affiche par exemple un membre de A
    };
    J'ai aussi besoin que ces options (qui seront toujours prevues pour une classe de base) puisse acceder aux membres de Base, vu ma strategie, je pars pour ajouter le mot clé friend a chaque fois que je definie une nouvelle classe implémentant Tag .

    Pour donner un exemple pratique de ce que je veux faire, j'ai une classe camera a qui je peux affecter un tag Viser afin qu'elle vise un objet dans une scene, meme lorsqu'il change de position. Ce systeme est inspiré du graphe de scene de l'application cinema4D : http://cgtuts.s3.amazonaws.com/077_C4D_Room2/14.jpg (interface graphique pour ajouter un tag) et http://www.kxcad.net/CINEMA_4D/help/US/html/5749.html (principe de base)

    Que pensez vous de tout cela ?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Le fait est que tu souhaite invoquer un comportement polymorphe sur tes différents "tag".

    Tu ne peux donc utiliser que des pointeurs ou des référence sur des objets "passant pour être des tag" et qui sont, en réalité, "des type de tag particuliers".

    Comme l'utilisation d'un tableau de références n'est pas autorisée, il ne te reste donc que la solution qui consiste à manipuler un tableau de pointeurs de type tag.

    A partir de là, il faut voir ce qui serait le plus intéressant pour toi, car deux solutions s'offrent en gros à toi :
    1. Soit tu considère que ta classe Base est responsable de la durée de vie des tags qu'elle manipule, ce qui impliquera un certain nombre de copies et de destructions des différents tags
    2. Soit tu considère la possibilité d'avoir une autre classe qui s'occupe de gérer la durée de vie de ces tags de manière séparée.
    La première solution impliquerait que tes tags soient clonables, car ta classe tag a sémantique d'entité, et que, typiquement, les types ayant sémantique d'entité supportent assez mal la copie.

    De plus, elle implique également le fait, quelle que soit la manière dont la copie des tag est effectuée, que tu devra veiller à libérer correctement la mémoire allouée aux différents tag qu'elle contient lorsque ceux-ci ne seront plus utiles (au plus tard au moment de la destruction de Base).

    La deuxième solution peut s'avérer préférable si tes tags servent "à autre chose" que ta classe Base, s'ils se retrouvent, par exemple "dispatchés" vers différents objets de type totalement indépendant
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 17
    Par défaut
    Salut,
    Oui pour mon cas, je passe par la premiere solution que tu decris.
    Pour ce qui est de la manipulation de Base par Tag, je vais ajouter des methodes publiques (je pense que ca sera surtout des accesseurs/mutateurs) a Base, prévues (uniquement?) pour Tag. Ca me gêne un peu puisque leur mauvaise utilisation peut compromettre le fonctionnement interne de la classe, mais je ne vois pas d'autres solutions (qui respecte l'orienté objet)... Peut-etre demander des parametres instantiables que par les classes qui doivent s'en servir ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Tu devrais regarder du côté des Design Pattern (Decorateur, Visiteur, Chaine de responsabilité?)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 17
    Par défaut
    Bon je devrais m'en sortir avec les ressources que vous m'avez fournies, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2008, 11h05
  2. Réponses: 7
    Dernier message: 03/12/2008, 16h49
  3. Réponses: 1
    Dernier message: 29/10/2008, 14h13
  4. modification de comportement d'un objet dynamiquement
    Par dz_robotix dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/05/2007, 11h16
  5. Réponses: 15
    Dernier message: 19/06/2006, 19h25

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