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 :

travailler avec des objets statiques


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut travailler avec des objets statiques
    Bonsoir,

    débutant en C++, je voudrais savoir comment je pourrais définir des objets "fixes". Je m'explique : je crée une classe, et dans l'implémentation des méthodes, je voudrais pouvoir faire référence à / travailler sur des objets précis de cette même classe (voire d'une autre), qui sont toujours les mêmes.

    Dois je déclarer des attributs statiques correspondant à ces objets dans la définition de ma classe? Quelle est la meilleure façon de faire?

    Merci beaucoup,

    Romain.

  2. #2
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Généralement, quand on a besoin d'accès statiques à des objets, on a un problème d'architecture.

    Vous pourriez précisez le cas où vous avez besoin de ça?

  3. #3
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,

    Comme bretus, je ne suis pas sur de bien comprendre ton problème. Peux-tu détailler.

    Sinon, trivialement, crées des instances nommées au bon scope et utilises les:
    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
     
    class ma_classe
    {
    // ...
    };
     
    int main()
    {
      ma_class inst1;
      ma_class inst2;
      m_class inst3;
     
       fonction(inst1);
       fonction(inst2);
       // ...
    }

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Romain227 Voir le message
    Je m'explique : je crée une classe, et dans l'implémentation des méthodes, je voudrais pouvoir faire référence à / travailler sur des objets précis de cette même classe (voire d'une autre), qui sont toujours les mêmes.
    Ces contraintes ne sont pas suffisantes pour avoir recours aux objets statiques.
    Un objet statique doit exister durant toute la durée de vie du programme. Est-ce ici nécessaire ?

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour,
    Si tu ne peux/veux pas faire des instances nommées, tu peux créer une collection spécifique pour les instances dont tu as besoin.
    Après le type de collection dépend de la manière par laquelle tu accéderas aux instances : index, clé, etc.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bonjour,


    Voici le contexte : l'objectif pour moi est de réaliser l'animation basique d'un personnage 2D (avancer, courir, sauter, se baisser, faire demi-tour, etc...)

    actuellement la gestion de tout ça se fait avec une classe "Animation" ou des instances de cette classe sont créees, chacune correspondant à un mouvement défini (par exemple l'animation "courir" est un objet fait de plusieurs frames qui décortiquent le mouvement de course).

    je cherche maintenant à créer une classe nommée ici arbitrairement personnage ou je gèrerais les différents mouvements du personnage. Je me sens obligé à l'heure actuelle d'intégrer dans cette classe les animations prédéfinies correspondants aux mouvements de ce personnage.

    Supposons par exemple que je souhaite implémenter la méthode courir, j'écrirais quelque chose (sans aucun souci de rigueur ici ) comme :

    if (personnage.getAnimation() != saut) personnage.setAnimation(course);

    les objets saut et course étant des objets animations.

    N'ayant pas beaucoup d'expérience dans la structure d'un tel code (mais ne cherchant pas non plus à révolutionner le monde), je ne sais pas s'il s'agirait d'une bonne façon d'implémenter les choses.

    Merci beaucoup,

    Romain

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    il y plusieurs façons de prendre le problème. Je préconise pour ma part le design pattern State.
    Ton bonhomme aura différents états (running, idle, jumping, ...), et une unique fonction Draw(), qui appelera le Draw() de l'état courant.
    Cette méthode a ses inconvénients (compliqué s'il y a beaucoup d'états; attention aux transitions), mais elle est assez souple et générique.

    Bien amicalement,
    r0d.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,
    Citation Envoyé par r0d Voir le message
    Bonjour,

    il y plusieurs façons de prendre le problème. Je préconise pour ma part le design pattern State.
    Ton bonhomme aura différents états (running, idle, jumping, ...), et une unique fonction Draw(), qui appelera le Draw() de l'état courant.
    Cette méthode a ses inconvénients (compliqué s'il y a beaucoup d'états; attention aux transitions), mais elle est assez souple et générique.

    Bien amicalement,
    r0d.
    En fait, je séparerais bien encore un peu plus les responsabilités..
    Le bonhomme aurait effectivement différents états, mais la seule responsabilité de l'état serait... d'indiquer ce que fait le bonhomme à l'instant T.

    Il y aurait un "Drawer" dont la responsabilité serait effectivement l'affichage de... ce que l'on pourrait lui fournir en paramètre.

    ce "Drawer" pourrait d'ailleurs être spécialisé en fonction de la bibliothèque graphique utilisée et récupérerait l'état de l'élément qu'on lui demande de tracer d'une part, la séquence de frame correspondante de l'autre sur base d'un identifiant fourni par l'état, pour arriver au final à afficher l'animation.

    cela donnerait quelque chose comme
    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
    class Perso
    {
       public:
           void animate()
           {
               drawer_->animate(*this);
           }
           State const & state() const{return *state_;}
        private:
            Drawer * drawer_;
            State * state_;
    };
     
    class Drawer
    {
       public:
           Drawer(AnimationHolder * frames)frames_(frames)
           void animate(Perso & perso)
           {
               State const & st =perso.state();
               int stateId= st.id()
               AnimationHolder ::const_iterator start;
               AnimationHolder ::const_iterator end;
               frames_.find(st.id(),start,end); // void FrameHolder::find(int, const_iterator &, const_iterator & ) :D
              drawFrames(start,end);//affiche toutes les frames ;)
           }
       private:
           void drawFrames(AnimationHolder::const_iterator start,
                           AnimationHolder::const_iterator end)
           {
                while(start != end)
                {
                    (*start)->draw(/*paramètres éventuels */);
                    ++it;
                }
           }
           AnimationHolder * frames_;
    }
    Et quand même quelques explications

    AnimationHolder serait une classe de base pour une classe dont la seule responsabilité est de maintenir en mémoire l'ensemble des animations, qui sont elles meme un ensemble de frame.

    Frame est une classe de base des différentes représentations de frames qui peuvent exister (une frame directX est sans doute différente d'une frame OpenGl )

    Le AnimationHolder est créé (et remplis d'animations) lors de l'initialisation de la partie (que ce soit dans la fonction main ou dans la classe Game, selon ce qui est fait ).

    La fonction find du AnimationHolder va rechercher l'animation correspondant à l'id obtenue par l'état et redéfinir les itérateurs start et end pour qu'ils correspondent aux itérateurs respectif de la première frame et de la fin de l'animation trouvée.

    Le Drawer, créé juste après, reçoit en paramètre le AnimationHolder, qui sera gardé sous la forme d'un membre.
    Le personnage est créé en dernier et reçoit (d'une manière ou d'une autre) un pointeur sur le Drawer de manière à ce qu'il lui serve de membre.

    Nous obtenons donc un ordre de dépendance proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           State
          /
    Perso
          \
           Drawer  --> AnimationHolder--> Animation --> Frame
    dont chaque classe peut être dérivée de manière indépendante (ou peu s'en faut, car, si l'on rajoute un état, il faudra penser à rajouter... une animation, et donc des frames )

    Toutes ces classes font bien sur partie de hiérarchies de classes totalement indépendantes
    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

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    C'est effectivement une autre façon de voir les choses.
    Pour ma part, au plus j'avance dans le "monde du orienté objet", au plus j'ai tendance à laisser toujours plus de responsabilité aux classes elles-même.
    Par exemple, et pour rester dans le cadre de ce sujet, un bonhomme doit se débrouiller pour s'afficher lui-même. Il doit lui-même posséder ses images, gérer ses états et transitions, etc. Ce qui n'empêche pas de passer par des "helpers" (décorateurs, factory, etc., et même pourquoi pas - Ô ultime hérésie - des fonctions libres; souvent très utiles pour factoriser du code).

    L'avantage de cette façon de fonctionner est un découplage fort. Chaque classe se débrouille, et ainsi on peut changer le comportement de nos classes sans toucher aux classes qui manipulent ces dernières, et vice-versa.

    Mais encore une fois, c'est un choix, avec ses avantages et ses inconvénients. Un des inconvénients de cette "ultra-responsabilisation" est qu'on peut se retrouver avec des classes énormes et difficiles à diviser.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par r0d Voir le message
    C'est effectivement une autre façon de voir les choses.
    Pour ma part, au plus j'avance dans le "monde du orienté objet", au plus j'ai tendance à laisser toujours plus de responsabilité aux classes elles-même.
    Par exemple, et pour rester dans le cadre de ce sujet, un bonhomme doit se débrouiller pour s'afficher lui-même. Il doit lui-même posséder ses images, gérer ses états et transitions, etc. Ce qui n'empêche pas de passer par des "helpers" (décorateurs, factory, etc., et même pourquoi pas - Ô ultime hérésie - des fonctions libres; souvent très utiles pour factoriser du code).

    L'avantage de cette façon de fonctionner est un découplage fort. Chaque classe se débrouille, et ainsi on peut changer le comportement de nos classes sans toucher aux classes qui manipulent ces dernières, et vice-versa.

    Mais encore une fois, c'est un choix, avec ses avantages et ses inconvénients. Un des inconvénients de cette "ultra-responsabilisation" est qu'on peut se retrouver avec des classes énormes et difficiles à diviser.
    ...Ou se retrouver avec un "PropertyManager" transformé en singleton, composé de tellement d'accesseurs et de mutateurs qu'il en devient difficile de savoir si l'on dispose déjà d'une propriété particulière et qui, combe de malheur, va écrire dans trois fichiers différents : un dans le dossier personnel de l'utilisateur et deux dans des dossiers accessibles en écriture uniquement par l'administrateur

    Sans compter qu'il devient alors très difficile de décider d'hériter de ce genre de classe, car tu ne sera jamais sur d'avoir bien redéfini toutes les fonctions qui sont sensées l'être
    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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    merci pour votre aide, même si je trouve cela un peu rude à comprendre pour le débutant que je suis (je connais une grande partie des concepts du langage, l'aggrégation de tout ça dans un code tel que le design pattern m'est beaucoup plus difficile à comprendre).

    En reprenant le code de Koala, a quel niveau dois je définir le passage à un état suivant (en supposant que j'ai construit un diagramme d'états exhaustifs pour mon personnage) et le code à exécuter lorsque mon personnage se trouve dans un état donné? Comment dire, par exemple, que l'état "courir" n'est réalisable que si le personnage était dans un état précédent particulier?

    Peut-être est ce la compréhension de la structure du pattern qui m'échappe, je devrais probablement m'arrêter dessus un bon moment.

    Thx,

    Romain

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Romain227 Voir le message
    Bonjour,

    merci pour votre aide, même si je trouve cela un peu rude à comprendre pour le débutant que je suis (je connais une grande partie des concepts du langage, l'aggrégation de tout ça dans un code tel que le design pattern m'est beaucoup plus difficile à comprendre).

    En reprenant le code de Koala, a quel niveau dois je définir le passage à un état suivant (en supposant que j'ai construit un diagramme d'états exhaustifs pour mon personnage) et le code à exécuter lorsque mon personnage se trouve dans un état donné? Comment dire, par exemple, que l'état "courir" n'est réalisable que si le personnage était dans un état précédent particulier?

    Peut-être est ce la compréhension de la structure du pattern qui m'échappe, je devrais probablement m'arrêter dessus un bon moment.

    Thx,

    Romain
    Je dirais que c'est la compréhension non pas du pattern, mais de ce qu'est un automate à état, qui t'échappe un peu.

    Shameless plug: cf. http://blog.emmanueldeloget.com/inde...chines-a-etats (en dehors des considérations de langage).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    ^ merci pour le lien.

    En fait oui et non, c'est clair sur le lien que tu m'as fourni (où son application se situe au niveau des basculement d'écrans d'un JV) ; appliqué à la description d'un personnage, j'ia plus de mal.

    exemple qui me passe par la tête au moment où j'écris ces lignes:

    un personnage peut marcher et porter une caisse. Si je définis un état "marcher" et un état "porter", et en supposant que mon personnage peut marcher en portant, dois je définir un état "marcher + porter"?

    Est ce judicieux d'associer une animation à un état? (l'animation "marcher + porter" étant différente de l'animation "marcher" ou l'animation "porter")

    edit: question bête je pense, il faut a priori décrire autant d'états que nécessaires.

    ++ et bonne journée,

    Romain

Discussions similaires

  1. [C#]Travailler en synchrone avec des objets asynchrone
    Par mister3957 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2006, 18h12
  2. Travailler avec des hexadécimaux
    Par LEK dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/09/2005, 04h24
  3. Travailler / Créer des objets complexes
    Par Ekinoks dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2005, 14h38
  4. Réponses: 3
    Dernier message: 25/01/2005, 11h27
  5. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09

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