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 :

vector d'objets hérités


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut vector d'objets hérités
    Bonjour,

    J'avoue que le titre est plutôt mystique, mais je n'ai pas trouvé plus explicite. =/
    Je commence actuellement un nouveau projet de jeu, et me penche sur la gestion des différents menus ; j'ai opté, comme expliqué sur le wiki de la SFML, pour une classe mère CMenu qui possède une méthode virtuelle run(). Cette méthode est redéfinie par les classes filles, une pour chaque menu.

    Seulement, dans ma classe CGame (classe principale du jeu), j'utilise un attribut vector de CMenu* ; seulement, je n'arrive pas à conserver les objets d'une méthode à l'autre et pire j'ai à priori des fuites mémoires...

    Si j'essaie de faire un vector de CMenu, le compilateur m'explique logiquement que cette classe ne peut être instanciée.

    Connaitriez-vous une solution contre ce genre de problèmes svp ?

    Voici quelques extraits du code actuel :

    - la déclaration du vector
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<CMenu*> m_menus;
    - son initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Create and push all menus
      m_menus.push_back(new CMenu_0);
     
      // Set app to all menus
      for (vector<CMenu*>::iterator i = m_menus.begin(); i != m_menus.end(); ++i) {
        (*i)->setApp(&m_app);
      }
     
      m_menus[CMenu::WELCOME]->run();
    - la classe mère CMenu
    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
     
    class CMenu {
     
      protected:
        sf::RenderWindow* m_pApp;
        int m_nextId;
     
      public:
        /** Menus names */
        enum MenusNames { INVALID = -1,
                          WELCOME = 0 };
        /**
         *  Default constructor
         *  Set m_pApp to 0, to be sure the pointer will be passed
         */
        CMenu();
     
        /**
         *  Constructor
         *  Permit to init with a pointer to app
         */
        CMenu(sf::RenderWindow* pApp);
     
        /**
         *  Set the pointer to application object
         */
        void setApp(sf::RenderWindow* pApp);
     
        /**
         *  Menu loop
         *  Must be defined in under classes
         *  Manage display, events, etc...
         *  @return Next menu's ID
         */
        virtual int run() = 0;
     
    };
    Merci d'avance !

  2. #2
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Je ne comprends pas ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      m_menus.push_back(new CMenu_0);
    Un tel appel de fonction ajouterait simplement un élément de type CMenu_0 au vector m_menus.
    Existe-t-il dans ton programme un type C_Menu_0 (as-tu par exempe défini une classe C_Menu_0 ) ?

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut
    Oui CMenu_0 est une classe héritant justement de CMenu ; l'appel précédent était de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CMenu_0 menu;
    menu.setApp(&m_app);
    m_menus.push_back(&menu);
    Mais le pointeur dans m_menus pointait logiquement nulle part après la fin de la méthode. =/

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut
    Citation Envoyé par NainTernaute Voir le message
    Oui CMenu_0 est une classe héritant justement de CMenu ; l'appel précédent était de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CMenu_0 menu;
    menu.setApp(&m_app);
    m_menus.push_back(&menu);
    Mais le pointeur dans m_menus pointait logiquement nulle part après la fin de la méthode. =/
    Pour le fait que tu pointe nulle part c'est normal a la sortie de ton scope ton CMenu_0 est detruit.

    On est d'accord que ton vector est bien dans ta classe CGame ? Je pose la question car je ne vois pas de this... a moins que ce soit du code de constructeur.

    Pour ce qui est de ton impossibilite a instancier un CMenu, as tu bien implemente la methode virtuelle pure run ? Parce que logiquement ca devrait passer, mais tes bouts de code sont trop dispatchés et coupés pour que la comprehension soit efficace.

  5. #5
    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,

    Il faut un destructeur virtuel à CMenu, cf. cette entrée de la FAQ.

    MAT.

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Par défaut
    En fait, les fuites mémoires ne venaient pas de cette partie du code ; le fonctionnement avec un push_back(new CMenu_0) était bon. En revanche, le destructeur virtuel doit être une bonne idée également ; merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/11/2008, 09h54
  2. Vector d'objet et map de méthode.
    Par Mr Meuble dans le forum SL & STL
    Réponses: 2
    Dernier message: 06/06/2008, 11h41
  3. [JGoodies ] Utiliser un objet hérité pour le binding
    Par mush_H dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 18/09/2007, 09h02
  4. [STD] Vector d'objets abstraits
    Par mister3957 dans le forum SL & STL
    Réponses: 3
    Dernier message: 20/02/2007, 10h58
  5. [Débutant]vector d'objet
    Par Clark dans le forum SL & STL
    Réponses: 6
    Dernier message: 19/05/2006, 17h56

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