Partage
  • Partager sur Facebook
  • Partager sur Twitter

Class dériver

Hériter un pointeur

Sujet résolu
    25 juin 2007 à 1:56:38

    Bonjour tout le monde !

    Voilà je faisait un programme avec irrlicht où j'affiche un vaisseau, celui-ci est dans une instance de classe Vaisseau.
    Dedans je créer une instance de classe Reacteur, cette classe gérerat les particules servant à faire le feu qui sorte des réacteurs.

    Dans irrlicht il faut un pointeur vers le scenegraph pour faire un système de particule.

    Donc quand je dérive la classe Réacteur de Vaisseau j'utilise le pointeur *m_scenegraph de la class Vaisseau, que je stocke dans *m_scenegraphR qui lui appartient à Reacteur.

    Seuleument apparement le pointeur hériter de la classe Vaisseau ne contient pas le scenegraph de Vaisseau :(

    Voici le code : (Je met que l'éssentiel)
    Le main
    #include <iostream>
    #include <IRR/irrlicht.h>

    #include "Vaisseau.h"

    int main()
    {
        scene::ISceneManager* scenegraph = device->getSceneManager();
        // Le vaisseau
        Vaisseau vaisseau(scenegraph, "vaisseau.3ds") // On créer un nouveau vaisseau.
        // ...
        // Je ne met pas la suite puisque sa plante avant :p ;



    Vaisseau.cpp


    #include "Vaisseau.h"

    Vaisseau::Vaisseau(irr::scene::ISceneManager *scenegraph, irr::c8 *mesh)
    {
        m_scenegraph = scenegraph;
        m_vaisseau = scenegraph->getMesh(mesh);
        if (m_vaisseau == 0)
        {
            std::cout << "Probleme de chargement de " << mesh << std::endl;
            system("PAUSE");
            exit(EXIT_FAILURE);
        }
        m_Nvaisseau = scenegraph->addAnimatedMeshSceneNode(m_vaisseau);
       
        irr::core::aabbox3d<irr::f32> box(-5,0,-5,5,1,5);
        irr::core::vector3d<irr::f32> direction(0,0.03,0);
        irr::video::SColor minColor(0,0,0,0);
        irr::video::SColor maxColor(0,255,255,255);
       
        // Sa plante dans cette fonction
        m_reacteur->setReacteur(m_scenegraph, "fire.bmp", box, direction, 40, 70, minColor, maxColor, 400, 1100,0);
        m_reacteur->setParticleSize(irr::core::dimension2d<irr::f32>(10.0f, 30.0f));
       
        m_reacteur->setPosition(this->getPosition() + irr::core::vector3d<irr::f32>(0,40,0));
       
       
    }



    void Reacteur::setReacteur(irr::scene::ISceneManager *scenegraphR, irr::c8 *texturePath, irr::core::aabbox3d<irr::f32> box,
    irr::core::vector3d<irr::f32> direction, int minParticle, int maxParticle, irr::video::SColor minColor, irr::video::SColor maxColor, int minLifeTime, int maxLifeTime, int randomAngle)
    {
       
        m_scenegraphR = scenegraphR;
       
        //BUG ICI
        m_ps = m_scenegraphR->addParticleSystemSceneNode(false, 0);
       
        /* ... */
    }




    Vaisseau.h


    #ifndef DEF_VAISSEAU
    #define DEF_VAISSEAU



    #include <iostream>
    #include <IRR/irrlicht.h>


    #define DEFAULT_MIN_COLOR irr::video::SColor(0,0,0,0)
    #define DEFAULT_MAX_COLOR irr::video::SColor(255,255,255,0)


    class Reacteur;
    class Vaisseau;

    class Vaisseau
    {
    protected:
        irr::scene::ISceneManager *m_scenegraph;
        Reacteur *m_reacteur;
    private:
        irr::scene::IAnimatedMesh *m_vaisseau;
        irr::scene::IAnimatedMeshSceneNode *m_Nvaisseau;
        irr::core::vector3d<irr::f32> m_direction;
       
    public:
        // Méthodes
       
        Vaisseau();
        Vaisseau(irr::scene::ISceneManager *scenegraph);
        Vaisseau(irr::scene::ISceneManager *scenegraph, irr::c8 *mesh);
       
        void addReacteur();
        void setScale(irr::core::vector3df scale);
        void setPosition(irr::core::vector3df pos);
        void setMaterialFlag(irr::video::E_MATERIAL_FLAG flag, bool newValue);
        void setDirection(irr::core::vector3d<irr::f32> direction);
        void setRotation(irr::core::vector3d<irr::f32> rotation);
        irr::scene::ISceneManager* getScenegraph();
        irr::core::vector3d<irr::f32> getDirection();
        irr::core::vector3d<irr::f32> getPosition();
        irr::core::aabbox3d<irr::f32> getBox();
       
    };

    // Classe réacteur

    class Reacteur : public Vaisseau
    {
    protected:
        // Attributs
       
        irr::scene::ISceneManager *m_scenegraphR;
        irr::scene::IParticleSystemSceneNode* m_ps;
       
        irr::scene::IParticleEmitter* m_em;
        irr::scene::IParticleAffector* m_paf;
       
        irr::core::dimension2d<irr::f32> m_particleSize;
       
        irr::c8 *m_texturePath;
        irr::core::aabbox3d<irr::f32> m_Box;
        irr::core::vector3d<irr::f32> m_direction;
        int m_minParticle, m_maxParticle;
        irr::video::SColor m_minColor;
        irr::video::SColor m_maxColor;
        int m_minLifeTime, m_maxLifeTime, m_randomAngle;
       
       
       
    public:
        // Méthodes
       
        Reacteur();
        void setReacteur(irr::scene::ISceneManager *m_scenegraphR, irr::c8 *texturePath, irr::core::aabbox3d<irr::f32> box, irr::core::vector3d<irr::f32> direction, int minParticle = 40, int maxParticle = 70, irr::video::SColor minColor = DEFAULT_MIN_COLOR, irr::video::SColor maxColor = DEFAULT_MAX_COLOR, int minLifeTime = 400, int maxLifeTime = 1100, int randomAngle = 0);
       
       
    };

    #endif





    Quand je lance le débuguage il me trouve une erreur de segmentation, à la ligne avec le commentaire "BUG ICI", ce qui veut bien dire que à cette ligne j'éssai d'accèder à une méthode de l'objet qu'est censer pointer mon pointeur, mais que mon pointeur ne pointe rien du tout, donc que la méthode n'est pas accèssible par ce pointeur :-°

    Mais pourtant quand je rajoute ceci
    if(m_scenegraphR == NULL) std::cout << "NULL" << std::endl;
    juste avant la ligne qui bug, le NULL ne s'affiche pas à la console.
    J'en conclu que mon pointeur ne pointe pas au bon endroit ou que le pointeur pointe bien vers quelquechose et que ma classe n'y a pas accès :euh:

    Mais c'est bizarre puisque c'est censé pointer vers un attributs protected de la classe mère, la classe fille devrait donc pouvoir y avoir accès non ?? o_O


    Donc si quelqu'un sait pourquoi et comment faire pour passer un pointeur d'un classe mère à une de ses classe dériver, merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2007 à 9:20:51

      Ne faudrait-il pas initialiser le réacteur via son constructeur avant de vouloir utiliser une de ses méthodes ?

      C'est ce qui me vient à l'idée comme ça mais ça peut être autre chose.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        25 juin 2007 à 12:55:23

        Ben en fait Reacteur est declarer dans le Vaisseau donc je pensais que le constructeur par defaut était appeler au moment ou je créer une instance de vaisseau.
        C'est pour sa que j'ai recréer une méthode qui a un peu le même effet que le constructeur mais avec des parametre, car je ne peut passer de parametre au constructeur par défaut vu qu'il est appeler dans le .h
        Ou alors c'est tout a fait possible et je me plante royalement ^^
        • Partager sur Facebook
        • Partager sur Twitter
          25 juin 2007 à 15:34:06

          Non, tu dois appeler le constructeur dans la liste d'initialisation avant de pouvoir utiliser l'objet.

          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            25 juin 2007 à 19:34:57

            ok
            Mais quand je met le constructeur a l'initialisation comme sa :

            class Vaisseau
            {
            protected:
                irr::scene::ISceneManager *m_scenegraph;
                Reacteur *m_reacteur(m_scenegraph, "fire.bmp"); // Erreur ici
            private:
                irr::scene::IAnimatedMesh *m_vaisseau;
                irr::scene::IAnimatedMeshSceneNode *m_Nvaisseau;
                irr::core::vector3d<irr::f32> m_direction;
               
                // ...


            Mon compilateur me dis :

            expected `;' before '(' token

            A la ligne de la déclaration de l'objet Reacteur.

            Et la je vois pas comment résoudre...


            Sinon merci pour le constructeur dans la liste d'initialisation maintenant sa me reviens je suis bête ^^



            [EDIT] : en fait j'ai relu le cours de M@théo et je viens de voir que on appelais pas le constructeur dans la liste de déclaration comme je l'avais compris.
            Mais en créant un objet(pointeur) et de faire une allocation dynamique avec new dans le constructeur de Vaisseau, comme sa :
            m_reacteur = new Reacteur("fire.bmp", box, direction, 40, 70, minColor, maxColor, 400, 1100,0);

            Sans oublier le destructeur avec delete bien sur ^^

            Et sa marche, le mieux c'est que je n'ai plus besoin de transmettre en paramètre le scenegraph et donc moins de pointeur a gérer :p , vive l'héritage :D


            [EDIT 2] Je retire ce que j'ai dis sa marche plus mais alors le je comprend plus...
            Sa marchais ya deux secondes, je recompile le même code, sa marche plus :(
            La segfault de tout à l'heure qui revient au même endroit...
            • Partager sur Facebook
            • Partager sur Twitter
              26 juin 2007 à 20:05:16

              Apès moultes éssais je me retrouve toujours avec une erreur de segmentation à cete ligne :

              Reacteur::Reacteur(irr::c8 *texturePath,
                                 irr::core::aabbox3d<irr::f32> box,
                                 irr::core::vector3d<irr::f32> direction,
                                 int minParticle,
                                 int maxParticle,
                                 irr::video::SColor minColor,
                                 irr::video::SColor maxColor,
                                 int minLifeTime,
                                 int maxLifeTime,
                                 int randomAngle)
              {
                  m_ps = m_scenegraph->addParticleSystemSceneNode(false, 0); // Erreur ICI



              A prioris la seg fault est encore due au même problème : le reacteur est mal initialisé.
              Mais comment faire si même le constructeur est corromput ??
              Là je ne voit plus du tout quoi faire et connaissant trop bien mon code j'ai du mal à voir l'érreur >_<


              EDIT : J'ai en partie compris l'erreur, c'etbien le pointeur qui est éronné...
              Quand je demande de m'afficher l'adresse que contient mon pointeur je n'obtient pas la même adresse que m'indique le deboguer !
              En effet dans le dernier test que j'ai fait j'ai l'adresse 0xbaadf00d qui etait afficher alors que le deboguer me disait que lors de l'appel du constructeur de Vaisseau l'adresse contenue dans le pointeur est égal à 0x1aa22f0.
              Preuve en image, la je ne comprend plus !

              Image utilisateur

              Alors que ma console m'affiche ceci :
              Adresse = 0xbaadf00d


              Ce qui correspond pas du tout a l'adresse du scenegraph de la deuxieme fonction du screenshot...

              La question c'est comment la valeur de l'adresse a-t'elle put changer ?


              EDIT : Bon j'ai craquer j'en ai marre de ces histoires d'héritage alors on va reprendre la bonne vieille méthode, donné en parametre le scenegraph...


              a+
              • Partager sur Facebook
              • Partager sur Twitter

              Class dériver

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown