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 :

Crash a la création d'un attribut


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut Crash a la création d'un attribut
    Bonjour/bonsoir, c'est encore moi

    Je viens car j'ai (encore) un problème. J'ai trois classes: Scene, GuiScreen et GuiTest. GuiTest hérite de GuiScreen.

    Scene.h
    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
    #ifndef DEF_SCENE
    #define DEF_SCENE
     
    #include "Engine.h"
    #include "GuiTest.h"
     
    class Scene
    {
        public:
     
        Scene();
        ~Scene();
     
        void Draw();
     
        void Update();
     
        protected:
     
        GuiTest m_guiTest; ///C'est ici que ca plante
    };
     
    #endif
    Scene.cpp
    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
    #include "Scene.h"
     
    Scene::Scene()
    {
     
    }
     
    Scene::~Scene()
    {
     
    }
     
    void Scene::Draw()
    {
     
    }
     
    void Scene::Update()
    {
     
    }
    GuiTest.h
    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
    #ifndef DEF_GUITEST
    #define DEF_GUITEST
    #include "Gui.h"
    #include "GuiScreen.h"
    #include "GuiScreen.h"
    #include "GuiButton.h"
    #include <iostream>
     
    class GuiTest : public GuiScreen
    {
        public:
        GuiTest();
        ~GuiTest();
     
        void Update();
    };
     
    #endif
    GuiTest.cpp
    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
    #include "GuiTest.h"
     
    GuiTest::GuiTest()
    {
        std::cout<<"GuiTest()"<<std::endl;
        addGui(new GuiButton(10, 10, 70, 20, "test1"));
        addGui(new GuiButton(10, 40, 70, 20, "test2"));
    }
     
    GuiTest::~GuiTest()
    {
        delete m_guiList[0];
    }
     
    void GuiTest::Update()
    {
        std::cout<<"GuiTest is updating"<<std::endl;
        if(m_guiList[0]->isClicked())
        {
            std::cout<<"button is clicked"<<std::endl;
        }
    }
    GuiScreen.h
    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
    #ifndef DEF_GUISCREEN
    #define DEF_GUISCREEN
    #include <vector>
    #include "Gui.h"
     
    class GuiScreen : public Gui
    {
        protected:
     
        std::vector<Gui*> m_guiList;
     
        public:
     
        GuiScreen();
        void swap(GuiScreen &guiScreen);
        GuiScreen(int x, int y, int height, int width);
        ~GuiScreen();
        virtual void Update();
     
        void addGui(Gui* gui);
     
        int getGuiListSize();
        Gui* getGui(int index);
    };
     
    #endif
    GuiScreen.cpp
    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
    #include "guiscreen.h"
     
    using namespace std;
    using namespace sf;
     
    GuiScreen::GuiScreen() :
    m_guiList(0)
    {
     
    }
     
     
    GuiScreen::GuiScreen(int x, int y, int height, int width):
    Gui(x, y, height, width),
    m_guiList(0)
    {
     
    }
     
    GuiScreen::~GuiScreen()
    {
        for(int i(0); i<m_guiList.size(); ++i)
        {
            delete m_guiList[i];
        }
    }
     
    void GuiScreen::Update()
    {
     
    }
    void GuiScreen::addGui(Gui* gui)
    {
        m_guiList.push_back(gui);
    }
     
    int GuiScreen::getGuiListSize()
    {
        return m_guiList.size();
    }
     
     
    Gui* GuiScreen::getGui(int index)
    {
        return m_guiList[index];
    }
    Lorsque, a la ligne 20 de mon scene.h, je veut créer un GuiTest le programme plante. Quelqu'un a t'il une idée? Ne faite pas attention au std::cout c'etait juste pour "debugger" a l'artisanal étant donné que le call stack de code::block me donne des informations pas très explicites.
    PS: Lorsque je créer un GuiTest dans main.c par exemple tout fonctionne bien.

    Merci d'avoir (encore) lu mon pavé, j’espère que j'ai rien oublier et que mon message est compréhensible malgré les fautes d'orthographe.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    on est bien d'accord que par définition, un .h ne contient que des déclarations?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Oui par "créer" je veut dire "déclarer" après je compte l'initialiser dans le .cpp mais vu que ça crache la déclaration je ferais ça plus tard.

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Negatio Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GuiTest::~GuiTest()
    {
        delete m_guiList[0];
    }
    L'attribut appartient à GuiScreen, c'est à lui de le supprimer, pas à GuiTest. (surtout que GuiScreen le supprime aussi)
    Penses à mettre tes destructeurs virtuels pour toutes tes classes héritées.

    Sinon le problème ne vient pas des classes montrées, donc probablement de Gui ou GuiButton. (j'ai utilisé des structures vides pour tester ton code à la place de ces deux classes, me semble pas qu'il y ai de problème dans le code présenté donc).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Gui {
    	Gui() { }
    	Gui(int, int, int, int) { }
    };
     
     
    struct GuiButton: Gui {
    	GuiButton(int, int, int, int, char*) { }
    };

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Merci pour cet réponse.

    L'attribut appartient à GuiScreen, c'est à lui de le supprimer, pas à GuiTest.
    C'est vrai, j'y avait pas penser.

    Je poste les classes Gui et GuiButton on sait jamais.

    Gui.h
    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
    #ifndef DEF_GUI
    #define DEF_GUI
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
    #include "Engine.h"
    #include "EngineRender.h"
    #include "EngineWindow.h"
    #include "EngineControl.h"
     
     
    class Gui
    {
        public:
     
        Gui();
        Gui(int x, int y, int height, int width);
        ~Gui();
        sf::IntRect getRect();
     
        virtual sf::Sprite getSprite();
        virtual void draw();
        virtual bool isPointed();
        virtual bool isClicked();
     
        protected:
     
        sf::Sprite m_sprite;
        sf::IntRect m_rect;
     
    };
     
    #endif
    Gui.cpp
    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
    #include "Gui.h"
     
    using namespace std;
    using namespace sf;
     
    Gui::Gui()
    {
     
    }
     
    Gui::Gui(int x, int y, int height, int width) 
    {
        m_rect.top = x;
        m_rect.left = y;
        m_rect.width = width;
        m_rect.height = height;
    }
     
    Gui::~Gui()
    {
     
    }
     
    IntRect Gui::getRect()
    {
        return m_rect;
    }
     
    sf::Sprite Gui::getSprite()
    {
     
    }
     
    void Gui::draw()
    {
     
    }
     
    bool Gui::isPointed()
    {
     
    }
     
    bool Gui::isClicked()
    {
     
    }
    GuiButton.h
    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
    #ifndef DEF_GUIBUTTON
    #define DEF_GUIBUTTON
    #include "Gui.h"
     
    class GuiButton : public Gui
    {
        private:
     
        sf::Sprite m_sprite;
        sf::Texture m_released;
        sf::Texture m_pressed;
        int m_state;
        sf::String m_label;
     
        public:
     
        GuiButton();
        GuiButton(int x, int y, int height, int width, sf::String label);
        ~GuiButton();
        bool isPointed();
        bool isClicked();
     
        sf::Sprite getSprite();
     
        void draw();
    };
     
    #endif
    GuiButton.cpp
    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
    #include "GuiButton.h"
     
    using namespace std;
    using namespace sf;
     
    GuiButton::GuiButton() :
    m_label(" ")
    {
     
    }
     
    GuiButton::GuiButton(int x, int y, int height, int width, sf::String label) :
    Gui(x, y, height, width),
    m_label(label)
    {
        m_released.loadFromImage(Engine::engineRender.makeImage(Engine::engineRender.Button, m_rect.height, m_rect.width));
        m_pressed.loadFromImage(Engine::engineRender.makeImage(Engine::engineRender.ButtonP, m_rect.height, m_rect.width));
        m_sprite.setTexture(m_released);
        m_sprite.setPosition(m_rect.top, m_rect.left);
    }
     
    GuiButton::~GuiButton()
    {
     
    }
     
    bool GuiButton::isPointed()
    {
        if(m_rect.contains(Engine::engineControl.getMousePosition().x, Engine::engineControl.getMousePosition().y))
        return true;
    }
     
    bool GuiButton::isClicked()
    {
     
    }
     
    Sprite GuiButton::getSprite()
    {
        return m_sprite;
    }
     
    void GuiButton::draw()
    {
        Engine::engineWindow.drawSprite(m_sprite);
    }
    EDIT:

    Il se passe un truc étrange. Je cherchais encore la source du problème en plaçant de multiples std::cout (oui je sait, c'est pas bien ), j'en ai placer un a la ligne 16 de GuiButton.cpp et le programme ne crash plus! Cela dit il ne fait totalement ce qu'il est censé faire. Comment un std::cout peut empêcher un programme de planter? Décidément les arcanes du c++ sont pour moi plutôt obscures .

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Personne n'a d'idées?

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Un comportement de ce type traduit un problème subtil:

    Tu as un comportement indéfini par la norme quelque part dans ton code.
    Active plus de warning de compilation, cherche une fuite mémoire, tu pourrais avoir des indices.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    J'ai régler presque tout les warnings, il m'en reste seulement deux, peut-être la cause?

    C:\Users\Negatio\Desktop\C++ SFML\Test 3\GuiButton.cpp|31|warning: control reaches end of non-void function|

    C:\Users\Negatio\Desktop\C++ SFML\Test 3\GuiScreen.cpp|22|warning: comparison between signed and unsigned integer expressions|

    Pour ce qui est des fuites mémoires je sait pas vraiment les détecter, j'arrive a peine a me servir du debug.

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

Discussions similaires

  1. Création de table attribut des champs
    Par allexpert dans le forum Développement
    Réponses: 4
    Dernier message: 01/02/2010, 14h45
  2. [Dojo] Création de class: attribut de type instance d'objet
    Par Zineb1987_UNI dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 08/12/2009, 10h21
  3. Création d'un attribut dynamique pour un object
    Par supernova dans le forum Flash/Flex
    Réponses: 1
    Dernier message: 24/11/2009, 15h54
  4. Création d'un attribut de type tableau en base
    Par Toph1 dans le forum W4 Express
    Réponses: 0
    Dernier message: 06/02/2009, 15h41
  5. Création de dossier -> attribut lecture seule VB6 / XP
    Par ben f dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/02/2008, 09h05

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